{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Recommender Systems 2020/21\n",
    "\n",
    "### Practice 3bis - Collaborative Based recommenders\n",
    "\n",
    "\n",
    "### Load the data you saw last time:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as pyplot\n",
    "%matplotlib inline  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's use the DataReader provided with the course repo"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from Data_manager.Movielens.Movielens10MReader import Movielens10MReader\n",
    "from Base.Evaluation.Evaluator import EvaluatorHoldout\n",
    "from Data_manager.split_functions.split_train_validation_random_holdout import split_train_in_two_percentage_global_sample"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Movielens10M: Verifying data consistency...\n",
      "Movielens10M: Verifying data consistency... Passed!\n",
      "DataReader: current dataset is: <class 'Data_manager.Dataset.Dataset'>\n",
      "\tNumber of items: 10681\n",
      "\tNumber of users: 69878\n",
      "\tNumber of interactions in URM_all: 10000054\n",
      "\tValue range in URM_all: 0.50-5.00\n",
      "\tInteraction density: 1.34E-02\n",
      "\tInteractions per user:\n",
      "\t\t Min: 2.00E+01\n",
      "\t\t Avg: 1.43E+02\n",
      "\t\t Max: 7.36E+03\n",
      "\tInteractions per item:\n",
      "\t\t Min: 0.00E+00\n",
      "\t\t Avg: 9.36E+02\n",
      "\t\t Max: 3.49E+04\n",
      "\tGini Index: 0.57\n",
      "\n",
      "\tICM name: ICM_genres, Value range: 1.00 / 1.00, Num features: 20, feature occurrences: 21564, density 1.01E-01\n",
      "\tICM name: ICM_tags, Value range: 1.00 / 69.00, Num features: 10217, feature occurrences: 108563, density 9.95E-04\n",
      "\tICM name: ICM_all, Value range: 1.00 / 69.00, Num features: 10237, feature occurrences: 130127, density 1.19E-03\n",
      "\n",
      "\n",
      "Warning: 76 (0.11 %) of 69878 users have no sampled items\n",
      "Warning: 235 (0.34 %) of 69878 users have no sampled items\n"
     ]
    }
   ],
   "source": [
    "dataReader = Movielens10MReader()\n",
    "dataset = dataReader.load_data()\n",
    "\n",
    "URM_all = dataset.get_URM_all()\n",
    "\n",
    "URM_train, URM_test = split_train_in_two_percentage_global_sample(URM_all, train_percentage = 0.80)\n",
    "URM_train, URM_validation = split_train_in_two_percentage_global_sample(URM_train, train_percentage = 0.80)\n",
    "\n",
    "evaluator_validation = EvaluatorHoldout(URM_validation, cutoff_list=[10])\n",
    "evaluator_test = EvaluatorHoldout(URM_test, cutoff_list=[10])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Item-based Collaborative Filtering"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "from Base.Similarity.Compute_Similarity_Python import Compute_Similarity_Python\n",
    "import numpy as np\n",
    "\n",
    "class ItemKNNCFRecommender(object):\n",
    "    \n",
    "    def __init__(self, URM):\n",
    "        self.URM = URM\n",
    "        \n",
    "            \n",
    "    def fit(self, topK=50, shrink=100, normalize=True, similarity=\"cosine\"):\n",
    "        \n",
    "        similarity_object = Compute_Similarity_Python(self.URM, shrink=shrink, \n",
    "                                                  topK=topK, normalize=normalize, \n",
    "                                                  similarity = similarity)\n",
    "        \n",
    "        self.W_sparse = similarity_object.compute_similarity()\n",
    "\n",
    "        \n",
    "    def recommend(self, user_id, at=None, exclude_seen=True):\n",
    "        # compute the scores using the dot product\n",
    "        user_profile = self.URM[user_id]\n",
    "        scores = user_profile.dot(self.W_sparse).toarray().ravel()\n",
    "\n",
    "        if exclude_seen:\n",
    "            scores = self.filter_seen(user_id, scores)\n",
    "\n",
    "        # rank items\n",
    "        ranking = scores.argsort()[::-1]\n",
    "            \n",
    "        return ranking[:at]\n",
    "    \n",
    "    \n",
    "    def filter_seen(self, user_id, scores):\n",
    "\n",
    "        start_pos = self.URM.indptr[user_id]\n",
    "        end_pos = self.URM.indptr[user_id+1]\n",
    "\n",
    "        user_profile = self.URM.indices[start_pos:end_pos]\n",
    "        \n",
    "        scores[user_profile] = -np.inf\n",
    "\n",
    "        return scores"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Test our CF recommender:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Similarity column 5500 ( 51 % ), 182.14 column/sec, elapsed time 0.50 min\n",
      "Similarity column 10681 ( 100 % ), 184.95 column/sec, elapsed time 0.96 min\n"
     ]
    }
   ],
   "source": [
    "recommender = ItemKNNCFRecommender(URM_train)\n",
    "recommender.fit(shrink=0.0, topK=50)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Let's compute recommendations for a fixed group of users"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Reasonable implementation speed is 569.44 usr/sec\n"
     ]
    }
   ],
   "source": [
    "import time\n",
    "\n",
    "n_users_to_test = 1000\n",
    "\n",
    "start_time = time.time()\n",
    "\n",
    "for user_id in range(n_users_to_test):\n",
    "    recommender.recommend(user_id, at=5)\n",
    "    \n",
    "end_time = time.time()\n",
    "\n",
    "print(\"Reasonable implementation speed is {:.2f} usr/sec\".format(n_users_to_test/(end_time-start_time)))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Remember to keep the URM in CSR format!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Parameter tuning\n",
    "\n",
    "#### Once we have built our model we can play with its parameters\n",
    "* Number of neighbors\n",
    "* Shrinkage\n",
    "* Similarity type"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Number of neighbors"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ItemKNNCFRecommender: URM Detected 68 (0.64 %) cold items.\n",
      "Similarity column 10681 ( 100 % ), 1106.89 column/sec, elapsed time 0.16 min\n",
      "EvaluatorHoldout: Processed 61000 ( 87.39% ) in 30.44 sec. Users per second: 2004\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 34.56 sec. Users per second: 2020\n",
      "ItemKNNCFRecommender: URM Detected 68 (0.64 %) cold items.\n",
      "Similarity column 10681 ( 100 % ), 1068.68 column/sec, elapsed time 0.17 min\n",
      "EvaluatorHoldout: Processed 58000 ( 83.09% ) in 30.33 sec. Users per second: 1913\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 36.47 sec. Users per second: 1914\n",
      "ItemKNNCFRecommender: URM Detected 68 (0.64 %) cold items.\n",
      "Similarity column 10681 ( 100 % ), 1076.54 column/sec, elapsed time 0.17 min\n",
      "EvaluatorHoldout: Processed 54000 ( 77.36% ) in 30.12 sec. Users per second: 1793\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 39.11 sec. Users per second: 1785\n",
      "ItemKNNCFRecommender: URM Detected 68 (0.64 %) cold items.\n",
      "Similarity column 10681 ( 100 % ), 1034.72 column/sec, elapsed time 0.17 min\n",
      "EvaluatorHoldout: Processed 50000 ( 71.63% ) in 30.38 sec. Users per second: 1646\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 42.29 sec. Users per second: 1651\n",
      "ItemKNNCFRecommender: URM Detected 68 (0.64 %) cold items.\n",
      "Similarity column 10681 ( 100 % ), 1071.15 column/sec, elapsed time 0.17 min\n",
      "EvaluatorHoldout: Processed 41000 ( 58.74% ) in 30.17 sec. Users per second: 1359\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 51.40 sec. Users per second: 1358\n"
     ]
    }
   ],
   "source": [
    "from KNN.ItemKNNCFRecommender import ItemKNNCFRecommender\n",
    "\n",
    "x_tick = [10, 50, 100, 200, 500]\n",
    "MAP_per_k = []\n",
    "\n",
    "for topK in x_tick:\n",
    "    \n",
    "    recommender = ItemKNNCFRecommender(URM_train)\n",
    "    recommender.fit(shrink=0.0, topK=topK)\n",
    "    \n",
    "    result_dict, _ = evaluator_test.evaluateRecommender(recommender)\n",
    "    \n",
    "    MAP_per_k.append(result_dict[10][\"MAP\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "pyplot.plot(x_tick, MAP_per_k)\n",
    "pyplot.ylabel('MAP')\n",
    "pyplot.xlabel('TopK')\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### On this dataset the number of neighbors has a great impact on MAP.\n",
    "\n",
    "#### Different datasets will behave in different ways."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Shrinkage"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ItemKNNCFRecommender: URM Detected 68 (0.64 %) cold items.\n",
      "Similarity column 10681 ( 100 % ), 1002.85 column/sec, elapsed time 0.18 min\n",
      "EvaluatorHoldout: Processed 54000 ( 77.36% ) in 30.21 sec. Users per second: 1788\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 39.10 sec. Users per second: 1785\n",
      "ItemKNNCFRecommender: URM Detected 68 (0.64 %) cold items.\n",
      "Similarity column 10681 ( 100 % ), 1099.94 column/sec, elapsed time 0.16 min\n",
      "EvaluatorHoldout: Processed 53000 ( 75.93% ) in 30.33 sec. Users per second: 1747\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 39.45 sec. Users per second: 1770\n",
      "ItemKNNCFRecommender: URM Detected 68 (0.64 %) cold items.\n",
      "Similarity column 10681 ( 100 % ), 1070.93 column/sec, elapsed time 0.17 min\n",
      "EvaluatorHoldout: Processed 54000 ( 77.36% ) in 30.18 sec. Users per second: 1790\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 39.21 sec. Users per second: 1780\n",
      "ItemKNNCFRecommender: URM Detected 68 (0.64 %) cold items.\n",
      "Similarity column 10681 ( 100 % ), 1137.42 column/sec, elapsed time 0.16 min\n",
      "EvaluatorHoldout: Processed 56000 ( 80.23% ) in 30.14 sec. Users per second: 1858\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 37.57 sec. Users per second: 1858\n",
      "ItemKNNCFRecommender: URM Detected 68 (0.64 %) cold items.\n",
      "Similarity column 10681 ( 100 % ), 1130.56 column/sec, elapsed time 0.16 min\n",
      "EvaluatorHoldout: Processed 55000 ( 78.79% ) in 30.22 sec. Users per second: 1820\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 38.32 sec. Users per second: 1821\n",
      "ItemKNNCFRecommender: URM Detected 68 (0.64 %) cold items.\n",
      "Similarity column 10681 ( 100 % ), 1108.15 column/sec, elapsed time 0.16 min\n",
      "EvaluatorHoldout: Processed 53000 ( 75.93% ) in 30.18 sec. Users per second: 1756\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 39.75 sec. Users per second: 1756\n"
     ]
    }
   ],
   "source": [
    "x_tick = [0, 10, 50, 100, 200, 500]\n",
    "MAP_per_shrinkage = []\n",
    "\n",
    "for shrink in x_tick:\n",
    "    \n",
    "    recommender = ItemKNNCFRecommender(URM_train)\n",
    "    recommender.fit(shrink=shrink, topK=100)\n",
    "    \n",
    "    result_dict, _ = evaluator_test.evaluateRecommender(recommender)\n",
    "    \n",
    "    MAP_per_shrinkage.append(result_dict[10][\"MAP\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "pyplot.plot(x_tick, MAP_per_shrinkage)\n",
    "pyplot.ylabel('MAP')\n",
    "pyplot.xlabel('Shrinkage')\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### The shrinkage value (i.e. support) has no impact. Combine a parameter search with the two to ensure maximum recommendation quality"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## REMINDER: Be careful, overfitting!\n",
    "\n",
    "#### While a thorough parameter tuning might result in significantly higher MAP on your validation split, it could have only marginally better or even worse MAP on the test set"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# User-based Collaborative Filtering"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "class UserKNNCFRecommender(object):\n",
    "    \n",
    "    def __init__(self, URM):\n",
    "        self.URM = URM\n",
    "        \n",
    "            \n",
    "    def fit(self, topK=50, shrink=100, normalize=True, similarity=\"cosine\"):\n",
    "        \n",
    "        similarity_object = Compute_Similarity_Python(self.URM.T, shrink=shrink, \n",
    "                                                  topK=topK, normalize=normalize, \n",
    "                                                  similarity = similarity)\n",
    "        \n",
    "        self.W_sparse = similarity_object.compute_similarity()\n",
    "\n",
    "        \n",
    "    def recommend(self, user_id, at=None, exclude_seen=True):\n",
    "        # compute the scores using the dot product\n",
    "        \n",
    "        scores = self.W_sparse[user_id, :].dot(self.URM).toarray().ravel()\n",
    "\n",
    "        if exclude_seen:\n",
    "            scores = self.filter_seen(user_id, scores)\n",
    "\n",
    "        # rank items\n",
    "        ranking = scores.argsort()[::-1]\n",
    "            \n",
    "        return ranking[:at]\n",
    "    \n",
    "    \n",
    "    def filter_seen(self, user_id, scores):\n",
    "\n",
    "        start_pos = self.URM.indptr[user_id]\n",
    "        end_pos = self.URM.indptr[user_id+1]\n",
    "\n",
    "        user_profile = self.URM.indices[start_pos:end_pos]\n",
    "        \n",
    "        scores[user_profile] = -np.inf\n",
    "\n",
    "        return scores"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Test our CF recommender:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Similarity column 9800 ( 14 % ), 324.28 column/sec, elapsed time 0.50 min\n",
      "Similarity column 19700 ( 28 % ), 327.12 column/sec, elapsed time 1.00 min\n",
      "Similarity column 29600 ( 42 % ), 327.70 column/sec, elapsed time 1.51 min\n",
      "Similarity column 39600 ( 57 % ), 328.72 column/sec, elapsed time 2.01 min\n",
      "Similarity column 49500 ( 71 % ), 328.71 column/sec, elapsed time 2.51 min\n",
      "Similarity column 59400 ( 85 % ), 328.85 column/sec, elapsed time 3.01 min\n",
      "Similarity column 69300 ( 99 % ), 328.64 column/sec, elapsed time 3.51 min\n",
      "Similarity column 69878 ( 100 % ), 328.61 column/sec, elapsed time 3.54 min\n"
     ]
    }
   ],
   "source": [
    "recommender = UserKNNCFRecommender(URM_train)\n",
    "recommender.fit(shrink=0.0, topK=50)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "####  Let's compute recommendations for a fixed group of users"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Reasonable implementation speed is 2237.01 usr/sec\n"
     ]
    }
   ],
   "source": [
    "import time\n",
    "\n",
    "n_users_to_test = 1000\n",
    "\n",
    "start_time = time.time()\n",
    "\n",
    "for user_id in range(n_users_to_test):\n",
    "    recommender.recommend(user_id, at=5)\n",
    "    \n",
    "end_time = time.time()\n",
    "\n",
    "print(\"Reasonable implementation speed is {:.2f} usr/sec\".format(n_users_to_test/(end_time-start_time)))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Parameter tuning\n",
    "\n",
    "#### Once we have built our model we can play with its parameters\n",
    "* Number of neighbors\n",
    "* Shrinkage\n",
    "* Similarity type"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Number of neighbors"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "UserKNNCFRecommender: URM Detected 68 (0.64 %) cold items.\n",
      "Similarity column 9529 ( 14 % ), 316.63 column/sec, elapsed time 0.50 min\n",
      "Similarity column 18998 ( 27 % ), 315.84 column/sec, elapsed time 1.00 min\n",
      "Similarity column 28425 ( 41 % ), 315.25 column/sec, elapsed time 1.50 min\n",
      "Similarity column 47365 ( 68 % ), 315.56 column/sec, elapsed time 2.50 min\n",
      "Similarity column 66437 ( 95 % ), 315.98 column/sec, elapsed time 3.50 min\n",
      "Similarity column 69878 ( 100 % ), 315.43 column/sec, elapsed time 3.69 min\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 29.98 sec. Users per second: 2328\n",
      "UserKNNCFRecommender: URM Detected 68 (0.64 %) cold items.\n",
      "Similarity column 9573 ( 14 % ), 318.93 column/sec, elapsed time 0.50 min\n",
      "Similarity column 19134 ( 27 % ), 316.53 column/sec, elapsed time 1.01 min\n",
      "Similarity column 28488 ( 41 % ), 314.62 column/sec, elapsed time 1.51 min\n",
      "Similarity column 47195 ( 68 % ), 313.65 column/sec, elapsed time 2.51 min\n",
      "Similarity column 65996 ( 94 % ), 313.92 column/sec, elapsed time 3.50 min\n",
      "Similarity column 69878 ( 100 % ), 313.59 column/sec, elapsed time 3.71 min\n",
      "EvaluatorHoldout: Processed 64000 ( 91.69% ) in 30.47 sec. Users per second: 2100\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 33.25 sec. Users per second: 2099\n",
      "UserKNNCFRecommender: URM Detected 68 (0.64 %) cold items.\n",
      "Similarity column 19142 ( 27 % ), 317.33 column/sec, elapsed time 1.01 min\n",
      "Similarity column 28557 ( 41 % ), 315.80 column/sec, elapsed time 1.51 min\n",
      "Similarity column 47360 ( 68 % ), 315.01 column/sec, elapsed time 2.51 min\n",
      "Similarity column 66297 ( 95 % ), 315.60 column/sec, elapsed time 3.50 min\n",
      "Similarity column 69878 ( 100 % ), 314.94 column/sec, elapsed time 3.70 min\n",
      "EvaluatorHoldout: Processed 58000 ( 83.09% ) in 30.18 sec. Users per second: 1922\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 36.32 sec. Users per second: 1922\n",
      "UserKNNCFRecommender: URM Detected 68 (0.64 %) cold items.\n",
      "Similarity column 9411 ( 13 % ), 313.69 column/sec, elapsed time 0.50 min\n",
      "Similarity column 18820 ( 27 % ), 313.42 column/sec, elapsed time 1.00 min\n",
      "Similarity column 28206 ( 40 % ), 311.31 column/sec, elapsed time 1.51 min\n",
      "Similarity column 46755 ( 67 % ), 311.42 column/sec, elapsed time 2.50 min\n",
      "Similarity column 65513 ( 94 % ), 312.02 column/sec, elapsed time 3.50 min\n",
      "Similarity column 69878 ( 100 % ), 311.36 column/sec, elapsed time 3.74 min\n",
      "EvaluatorHoldout: Processed 52000 ( 74.50% ) in 30.17 sec. Users per second: 1724\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 40.37 sec. Users per second: 1729\n",
      "UserKNNCFRecommender: URM Detected 68 (0.64 %) cold items.\n",
      "Similarity column 9314 ( 13 % ), 310.38 column/sec, elapsed time 0.50 min\n",
      "Similarity column 27930 ( 40 % ), 309.23 column/sec, elapsed time 1.51 min\n",
      "Similarity column 37104 ( 53 % ), 308.07 column/sec, elapsed time 2.01 min\n",
      "Similarity column 46210 ( 66 % ), 306.49 column/sec, elapsed time 2.51 min\n",
      "Similarity column 64351 ( 92 % ), 305.68 column/sec, elapsed time 3.51 min\n",
      "Similarity column 69878 ( 100 % ), 305.01 column/sec, elapsed time 3.82 min\n",
      "EvaluatorHoldout: Processed 40000 ( 57.30% ) in 30.13 sec. Users per second: 1328\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 53.02 sec. Users per second: 1317\n"
     ]
    }
   ],
   "source": [
    "from KNN.UserKNNCFRecommender import UserKNNCFRecommender\n",
    "\n",
    "x_tick = [10, 50, 100, 200, 500]\n",
    "MAP_per_k = []\n",
    "\n",
    "for topK in x_tick:\n",
    "    \n",
    "    recommender = UserKNNCFRecommender(URM_train)\n",
    "    recommender.fit(shrink=0.0, topK=topK)\n",
    "    \n",
    "    result_dict, _ = evaluator_test.evaluateRecommender(recommender)\n",
    "    \n",
    "    MAP_per_k.append(result_dict[10][\"MAP\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "pyplot.plot(x_tick, MAP_per_k)\n",
    "pyplot.ylabel('MAP')\n",
    "pyplot.xlabel('TopK')\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### On this dataset the number of neighbors does not have a great impact on MAP. Higher values of TopK might work even better\n",
    "\n",
    "#### Different datasets will behave in different ways."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Shrinkage"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "UserKNNCFRecommender: URM Detected 68 (0.64 %) cold items.\n",
      "Similarity column 9670 ( 14 % ), 308.04 column/sec, elapsed time 0.52 min\n",
      "Similarity column 27897 ( 40 % ), 311.33 column/sec, elapsed time 1.49 min\n",
      "Similarity column 37352 ( 53 % ), 312.01 column/sec, elapsed time 2.00 min\n",
      "Similarity column 46800 ( 67 % ), 312.18 column/sec, elapsed time 2.50 min\n",
      "Similarity column 56328 ( 81 % ), 312.94 column/sec, elapsed time 3.00 min\n",
      "Similarity column 65758 ( 94 % ), 313.14 column/sec, elapsed time 3.50 min\n",
      "Similarity column 69878 ( 100 % ), 312.41 column/sec, elapsed time 3.73 min\n",
      "EvaluatorHoldout: Processed 58000 ( 83.09% ) in 30.33 sec. Users per second: 1912\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 36.50 sec. Users per second: 1912\n",
      "UserKNNCFRecommender: URM Detected 68 (0.64 %) cold items.\n",
      "Similarity column 9608 ( 14 % ), 319.61 column/sec, elapsed time 0.50 min\n",
      "Similarity column 19176 ( 27 % ), 316.68 column/sec, elapsed time 1.01 min\n",
      "Similarity column 37792 ( 54 % ), 314.73 column/sec, elapsed time 2.00 min\n",
      "Similarity column 47205 ( 68 % ), 313.84 column/sec, elapsed time 2.51 min\n",
      "Similarity column 56490 ( 81 % ), 312.14 column/sec, elapsed time 3.02 min\n",
      "Similarity column 65548 ( 94 % ), 310.05 column/sec, elapsed time 3.52 min\n",
      "Similarity column 69878 ( 100 % ), 309.59 column/sec, elapsed time 3.76 min\n",
      "EvaluatorHoldout: Processed 56000 ( 80.23% ) in 30.43 sec. Users per second: 1840\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 37.58 sec. Users per second: 1857\n",
      "UserKNNCFRecommender: URM Detected 68 (0.64 %) cold items.\n",
      "Similarity column 9651 ( 14 % ), 319.05 column/sec, elapsed time 0.50 min\n",
      "Similarity column 19142 ( 27 % ), 308.41 column/sec, elapsed time 1.03 min\n",
      "Similarity column 36880 ( 53 % ), 304.93 column/sec, elapsed time 2.02 min\n",
      "Similarity column 54696 ( 78 % ), 305.60 column/sec, elapsed time 2.98 min\n",
      "Similarity column 64176 ( 92 % ), 306.29 column/sec, elapsed time 3.49 min\n",
      "Similarity column 69878 ( 100 % ), 306.06 column/sec, elapsed time 3.81 min\n",
      "EvaluatorHoldout: Processed 58000 ( 83.09% ) in 30.18 sec. Users per second: 1922\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 36.52 sec. Users per second: 1911\n",
      "UserKNNCFRecommender: URM Detected 68 (0.64 %) cold items.\n",
      "Similarity column 9547 ( 14 % ), 309.62 column/sec, elapsed time 0.51 min\n",
      "Similarity column 27624 ( 40 % ), 305.07 column/sec, elapsed time 1.51 min\n",
      "Similarity column 46010 ( 66 % ), 307.69 column/sec, elapsed time 2.49 min\n",
      "Similarity column 55656 ( 80 % ), 309.24 column/sec, elapsed time 3.00 min\n",
      "Similarity column 65065 ( 93 % ), 309.85 column/sec, elapsed time 3.50 min\n",
      "Similarity column 69878 ( 100 % ), 309.50 column/sec, elapsed time 3.76 min\n",
      "EvaluatorHoldout: Processed 58000 ( 83.09% ) in 30.01 sec. Users per second: 1933\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 36.52 sec. Users per second: 1911\n",
      "UserKNNCFRecommender: URM Detected 68 (0.64 %) cold items.\n",
      "Similarity column 9456 ( 14 % ), 314.48 column/sec, elapsed time 0.50 min\n",
      "Similarity column 18868 ( 27 % ), 314.04 column/sec, elapsed time 1.00 min\n",
      "Similarity column 28263 ( 40 % ), 313.17 column/sec, elapsed time 1.50 min\n",
      "Similarity column 47000 ( 67 % ), 313.53 column/sec, elapsed time 2.50 min\n",
      "Similarity column 56478 ( 81 % ), 313.81 column/sec, elapsed time 3.00 min\n",
      "Similarity column 65912 ( 94 % ), 313.87 column/sec, elapsed time 3.50 min\n",
      "Similarity column 69878 ( 100 % ), 313.26 column/sec, elapsed time 3.72 min\n",
      "EvaluatorHoldout: Processed 59000 ( 84.52% ) in 30.32 sec. Users per second: 1946\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 35.76 sec. Users per second: 1952\n",
      "UserKNNCFRecommender: URM Detected 68 (0.64 %) cold items.\n",
      "Similarity column 9368 ( 13 % ), 310.25 column/sec, elapsed time 0.50 min\n",
      "Similarity column 27903 ( 40 % ), 310.05 column/sec, elapsed time 1.50 min\n",
      "Similarity column 37364 ( 53 % ), 311.28 column/sec, elapsed time 2.00 min\n",
      "Similarity column 56094 ( 80 % ), 312.56 column/sec, elapsed time 2.99 min\n",
      "Similarity column 65639 ( 94 % ), 312.71 column/sec, elapsed time 3.50 min\n",
      "Similarity column 69878 ( 100 % ), 312.53 column/sec, elapsed time 3.73 min\n",
      "EvaluatorHoldout: Processed 61000 ( 87.39% ) in 30.51 sec. Users per second: 1999\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 34.88 sec. Users per second: 2001\n"
     ]
    }
   ],
   "source": [
    "x_tick = [0, 10, 50, 100, 200, 500]\n",
    "MAP_per_shrinkage = []\n",
    "\n",
    "for shrink in x_tick:\n",
    "    \n",
    "    recommender = UserKNNCFRecommender(URM_train)\n",
    "    recommender.fit(shrink=shrink, topK=100)\n",
    "    \n",
    "    result_dict, _ = evaluator_test.evaluateRecommender(recommender)\n",
    "    \n",
    "    MAP_per_shrinkage.append(result_dict[10][\"MAP\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "pyplot.plot(x_tick, MAP_per_shrinkage)\n",
    "pyplot.ylabel('MAP')\n",
    "pyplot.xlabel('Shrinkage')\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Comparing different similarity heuristics\n",
    "\n",
    "#### Let's see how different are the similarities "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ItemKNNCFRecommender: URM Detected 68 (0.64 %) cold items.\n",
      "Similarity column 10681 ( 100 % ), 1129.96 column/sec, elapsed time 0.16 min\n",
      "ItemKNNCFRecommender: URM Detected 68 (0.64 %) cold items.\n",
      "Similarity column 10681 ( 100 % ), 1122.36 column/sec, elapsed time 0.16 min\n",
      "ItemKNNCFRecommender: URM Detected 68 (0.64 %) cold items.\n",
      "Similarity column 10681 ( 100 % ), 1118.95 column/sec, elapsed time 0.16 min\n",
      "ItemKNNCFRecommender: URM Detected 68 (0.64 %) cold items.\n",
      "Similarity column 10681 ( 100 % ), 1105.97 column/sec, elapsed time 0.16 min\n"
     ]
    }
   ],
   "source": [
    "similarity_heuristic_list = [\"cosine\", \"dice\", \"jaccard\", \"pearson\"]\n",
    "similarity_dict = {}\n",
    "\n",
    "for similarity_heuristic in similarity_heuristic_list:\n",
    "    \n",
    "    recommender = ItemKNNCFRecommender(URM_train)\n",
    "    recommender.fit(shrink=0.0, topK=100, similarity = similarity_heuristic)\n",
    "    \n",
    "    similarity_dict[similarity_heuristic] = recommender.W_sparse"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Let's see what is the similarity distribution"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([9.9999994e-01, 9.9999994e-01, 9.9999994e-01, ..., 1.4800464e-03,\n",
       "       1.0818754e-03, 9.5912459e-04], dtype=float32)"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "W_cosine = similarity_dict[\"cosine\"]\n",
    "W_cosine.tocoo()\n",
    "\n",
    "coordinates_sorted = np.argsort(-W_cosine.data)\n",
    "\n",
    "cosine_similarities_sorted = W_cosine.data[coordinates_sorted]\n",
    "cosine_similarities_sorted"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEKCAYAAAD9xUlFAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzs3Xd4HNW9//H3ma3a1a66XGS5gXHvcgGDDZhiSoBQQglgLiFwyQ3cXBICgRRCAklIAxISQgIJSbhg4h8t1FxTDBgDtkNzL7jJTX21vZ7fH7Nay7ZkybZWxft9Pc8+szs7O3NGsvXZc86cM0prjRBCCAFg9HQBhBBC9B4SCkIIITIkFIQQQmRIKAghhMiQUBBCCJEhoSCEECJDQkEIIUSGhIIQQogMCQUhhBAZ1p4uwKEqLS3VQ4cO7eliCCFEn7JixYo6rXVZR9v1uVAYOnQoy5cv7+liCCFEn6KU2tqZ7aT5SAghRIaEghBCiAwJBSGEEBl9rk9BCJF74vE41dXVRCKRni5Kr+d0Ohk0aBA2m+2wPi+hIITo9aqrq/F4PAwdOhSlVE8Xp9fSWlNfX091dTXDhg07rH1krflIKfWYUqpGKbWynfeVUupBpdRGpdSnSqkp2SqLEKJvi0QilJSUSCB0QClFSUnJEdWostmn8Bdg3kHePwsYkX5cD/w+i2URQvRxEgidc6Q/p6yFgtb6baDhIJucD/xVm94HCpVSA7JVntee+Qv333Ed0UQ0W4cQQog+ryevPqoAtrd6XZ1edwCl1PVKqeVKqeW1tbWHdbDmxx/jzGeW8OLH7xzW54UQ4nAtX76cm2++uaeL0Sk9GQpt1XF0WxtqrR/RWldpravKyjocpd0m99QTAIjE4of1eSGEOFxVVVU8+OCDPV2MTunJUKgGKlu9HgTszNbBMgmkU9k6hBDiKPbXv/6VCRMmMHHiRK666iq2bt3K3LlzmTBhAnPnzmXbtm0A/OMf/2DcuHFMnDiR2bNnA/DWW29x7rnnAnDXXXdx7bXXcvLJJzN8+PB9wuLvf/8706dPZ9KkSdxwww0kk8luP8+evCT1BeDrSqmngBmAT2u9K3uHM2MhpdusjAgh+ogf/nMVq3c2d+k+xwz08oMvjG33/VWrVnHPPfewZMkSSktLaWhoYP78+Vx99dXMnz+fxx57jJtvvpnnnnuOu+++m9dee42Kigqampra3N/atWt588038fv9jBw5khtvvJGNGzeyYMEClixZgs1m42tf+xpPPPEEV199dZeea0eyFgpKqSeBk4FSpVQ18APABqC1fhh4GTgb2AiEgP/IVlnMAu2zEEKITnvjjTe4+OKLKS0tBaC4uJilS5fyzDPPAHDVVVfx7W9/G4BZs2ZxzTXX8KUvfYkLL7ywzf2dc845OBwOHA4H5eXl7Nmzh9dff50VK1Ywbdo0AMLhMOXl5d1wdvvKWihorS/v4H0N/Fe2jn+A9GVaUk8Qom872Df6bNFad3ipZ8v7Dz/8MB988AEvvfQSkyZN4uOPPz5gW4fDkXlusVhIJBJorZk/fz4/+clPurbwhyj35j6SPgUhxCGaO3cuTz/9NPX19QA0NDRwwgkn8NRTTwHwxBNPcOKJJwKwadMmZsyYwd13301paSnbt29vd7/7H2PhwoXU1NRkjrF1a6dmu+5SOTPNRUuKS5eCEOJQjR07ljvvvJM5c+ZgsViYPHkyDz74INdeey0///nPKSsr489//jMAt956Kxs2bEBrzdy5c5k4cSKLFy/u8Bhjxozhxz/+MWeccQapVAqbzcZDDz3EkCFDsn16+1C6j/2VrKqq0odzk51X77mTIX97hg8f+RnzZ5+XhZIJIbJlzZo1jB49uqeL0We09fNSSq3QWld19NmcaT5SLV3MfSsDhRCiW+VMKLRkQgrpUxBCiPbkTCi01BRUH2suE0KI7pQzoaBbriaTTBBCiHblTCi0XGIsFQUhhGhfzoSCTHMhhBAdy5lxCq1mxOvJUgghjgJ33XUX+fn5NDc3M3v2bE477bSeLlKXyZlQyAxRl0wQQnSRu+++u6eL0OVyrvlIyzQXQojDcM899zBy5EhOO+001q1bB8A111zDwoULAVi2bBknnHACEydOZPr06fj9fpLJJLfeeivTpk1jwoQJ/OEPf+jJU+iU3KspCCH6tlduh92fde0++4+Hs37a7tsrVqzgqaee4qOPPiKRSDBlyhSmTp2aeT8Wi3HppZeyYMECpk2bRnNzM3l5eTz66KMUFBSwbNkyotEos2bN4owzzmDYsGFdW/4ulDOhkCHNR0KIQ/TOO+/wxS9+EZfLBcB55+07Vc66desYMGBAZtprr9cLwL/+9S8+/fTTTG3C5/OxYcMGCYXeREsqCNG3HeQbfTYdrLWhvam1tdb85je/4cwzz8xm0bpUzvQp7J0lVUJBCHFoZs+ezbPPPks4HMbv9/PPf/5zn/dHjRrFzp07WbZsGQB+v59EIsGZZ57J73//e+Jx897w69evJxgMdnv5D0Xu1BRkRLMQ4jBNmTKFSy+9lEmTJjFkyBBOOumkfd632+0sWLCAm266iXA4TF5eHosWLeK6665jy5YtTJkyBa01ZWVlPPfccz10Fp2TO6GA3HlNCHH47rzzTu6888523582bRrvv//+Aevvvfde7r333mwWrUvlTvNReimXpAohRPtyJhQw5JJUIYToSO6EQgvpaBZCiHblTCgo5B7NQgjRkZwJhb2dCtKnIIQQ7cmZUFDKPFWpKAghRPtyJhRaSPOREOJwnXDCCT16/Lfeeotzzz03q8fImVBQMnhNCHGE3nvvvW49XjKZ7NbjQQ6FApnbKUgqCCEOT35+PoFAgLlz5zJlyhTGjx/P888/n3n/r3/9KxMmTGDixIlcddVVAOzZs4cvfvGLTJw4kYkTJ2aC5YILLmDq1KmMHTuWRx55ZJ9jfP/732fGjBksXbqUV199lVGjRnHiiSfyzDPPZP0cc2hEs0lJ+5EQfdrPPvwZaxvWduk+RxWP4rbpt3VqW6fTybPPPovX66Wuro6ZM2dy3nnnsXr1au655x6WLFlCaWkpDQ0NANx8883MmTOHZ599lmQySSAQAOCxxx6juLiYcDjMtGnTuOiiiygpKSEYDDJu3DjuvvtuIpEII0aM4I033uDYY4/l0ksv7dLzbkvu1BSQjmYhxJHTWnPHHXcwYcIETjvtNHbs2MGePXt44403uPjiiyktLQWguLgYgDfeeIMbb7wRAIvFQkFBAQAPPvggEydOZObMmWzfvp0NGzZktrnooosAWLt2LcOGDWPEiBEopbjyyiuzfn45U1PI3I1TagpC9Gmd/UafLU888QS1tbWsWLECm83G0KFDiUQi7U6f3Za33nqLRYsWsXTpUlwuFyeffDKRSAQwayIWiyWzbXffICyrNQWl1Dyl1Dql1Eal1O1tvD9YKfWmUuojpdSnSqmzs1YWZJoLIcSR8/l8lJeXY7PZePPNN9m6dSsAc+fO5emnn6a+vh4g03w0d+5cfv/73wNmx3FzczM+n4+ioiJcLhdr165tcyI9MKfk3rx5M5s2bQLgySefzPbpZS8UlFIW4CHgLGAMcLlSasx+m30XeFprPRm4DPhdtsrTaka8rB1CCHF0U0rx5S9/meXLl1NVVcUTTzzBqFGjABg7dix33nknc+bMYeLEidxyyy0APPDAA7z55puMHz+eqVOnsmrVKubNm0cikWDChAl873vfY+bMmW0ez+l08sgjj3DOOedw4oknMmTIkKyfYzabj6YDG7XWnwMopZ4CzgdWt9pGA9708wJgZ9ZKI/doFkIcgfr6eoqLiyktLWXp0qVtbjN//nzmz5+/z7p+/frtc4VSi1deeaXNfbR0RLeYN28ea9d2bcf6wWSz+agC2N7qdXV6XWt3AVcqpaqBl4GbslgeQKbOFkIcup07d3L88cfzrW99q6eLknXZrCm09dV8/7aby4G/aK1/qZQ6HvibUmqc3u8vt1LqeuB6gMGDBx9WYQwlE+IJIQ7PwIEDWb9+fU8Xo1tks6ZQDVS2ej2IA5uHvgI8DaC1Xgo4gdL9d6S1fkRrXaW1riorKzuyUkkoCCFEu7IZCsuAEUqpYUopO2ZH8gv7bbMNmAuglBqNGQq1WSlNS01BUkEIIdqVtVDQWieArwOvAWswrzJapZS6Wyl1XnqzbwJfVUp9AjwJXKOzNJBAyT2ahRCiQ1kdvKa1fhmzA7n1uu+3er4amJXNMmS09HCkJBaEEKI9OTPNRcuowEAs0cMlEUKI3iuHQsFc5llz5pSFEL1YItE7v6DmzF9Iq8U81URKxikIIQ7Nli1bGDVqFPPnz2fChAlcfPHFhEIhVqxYwZw5c5g6dSpnnnkmu3btAuCPf/wj06ZNY+LEiVx00UWEQiEArrnmGm655RZOOeUUbrvtNhYvXsykSZOYNGkSkydPxu/3o7Xm1ltvZdy4cYwfP54FCxYA5nxJJ598MhdffDGjRo3iy1/+clbmcsuZCfEMwwyFpPQpCNGn7b73XqJrunaEr2P0KPrfccdBt1m3bh2PPvoos2bN4tprr+Whhx7i2Wef5fnnn6esrIwFCxZw55138thjj3HhhRfy1a9+FYDvfve7PProo9x0kzk2d/369SxatAiLxcIXvvAFHnroIWbNmkUgEMDpdPLMM8/w8ccf88knn1BXV8e0adOYPXs2AB999BGrVq1i4MCBzJo1iyVLlnDiiSd26c8iZ2oKFsNsP0pJTUEIcRgqKyuZNcu8LubKK6/ktddeY+XKlZx++ulMmjSJH//4x1RXVwOwcuVKTjrpJMaPH88TTzzBqlWrMvu55JJLMrOgzpo1i1tuuYUHH3yQpqYmrFYr7777LpdffjkWi4V+/foxZ84cli1bBsD06dMZNGgQhmEwadIktmzZ0uXnmTM1BWu6UyGRlJqCEH1ZR9/os2X/Kaw9Hg9jx45tcx6ka665hueee46JEyfyl7/8hbfeeivzntvtzjy//fbbOeecc3j55ZeZOXMmixYtOmiTkMPhyDy3WCxZ6ZfImZoC0nwkhDgC27ZtywTAk08+ycyZM6mtrc2si8fjmRqB3+9nwIABxONxnnjiiXb3uWnTJsaPH89tt91GVVUVa9euZfbs2SxYsIBkMkltbS1vv/0206dPz/4JpuVMTaGFllAQQhyG0aNH8/jjj3PDDTcwYsQIbrrpJs4880xuvvlmfD4fiUSCb3zjG4wdO5Yf/ehHzJgxgyFDhjB+/Hj8fn+b+7z//vt58803sVgsjBkzhrPOOgu73c7SpUuZOHEiSinuu+8++vfv320zpaq+dieyqqoqvXz58kP+3Kr//T3G3Q/y+C3/yU+v/+8slEwIkS1r1qxh9OjRPXb8LVu2cO6557Jy5coeK8OhaOvnpZRaobWu6uizudN8lJaSmoIQQrQrB0NBrj4SQhyaoUOH9plawpHKnVBIXzmQ6mPNZUIIU19r6u4pR/pzyplQaJkltSkU6+GSCCEOldPppL6+XoKhA1pr6uvrcTqdh72P3Ln6KH2JccsgNiFE3zFo0CCqq6uprc3O7VaOJk6nk0GDBh3253MnFFrIFw0h+hybzcawYcN6uhg5IWeaj/b2KUhHsxBCtCdnQiFz5zXJBCGEaFfOhEILufpICCHal3OhIFcvCCFE+3InFNIT4klNQQgh2pc7oZAmNQUhhGhf7oRCy1zoMs2FEEK0K3dCIX2no1RCQkEIIdqTM6GgrGYoJOJdf6ciIYQ4WuRMKLTUFKLReA8XRAgheq+cCwWk+UgIIdqVO6GQviRVpZJyn2YhhGhH7oSCxTxVQ2tiUlsQQog25VAomM1HFq2JJpI9XBghhOidci8UUimiUlMQQog25UwoKJt56whrKkk0LqEghBBtyWooKKXmKaXWKaU2KqVub2ebLymlViulViml/jdrhcmEQkqaj4QQoh2duvOaUsqitT6kv6RKKQvwEHA6UA0sU0q9oLVe3WqbEcB3gFla60alVPmhHOOQ2GzmIpUiFJNQEEKItnS2prBRKfVzpdSYQ9j3dGCj1vpzrXUMeAo4f79tvgo8pLVuBNBa1xzC/g+JagmFZJJAVEY1CyFEWzobChOA9cCflFLvK6WuV0p5O/hMBbC91evq9LrWjgOOU0otSe93Xls7Sh9vuVJq+WHfuLtV85E/IqOahRCiLZ0KBa21X2v9R631CcC3gR8Au5RSjyuljm3nY6qtXe332gqMAE4GLscMncI2jv+I1rpKa11VVlbWmSIfqFVNwR+RmoIQQrSlU6GglLIopc5TSj0LPAD8EhgO/BN4uZ2PVQOVrV4PAna2sc3zWuu41nozsA4zJLqe0wGAI5kgKM1HQgjRpk51NAMbgDeBn2ut32u1fqFSanY7n1kGjFBKDQN2AJcBV+y3zXOYNYS/KKVKMZuTPu9s4Q+FYbMTNcCRSBCUjmYhhGhTZ0Phaq31u61XKKVmaa2XaK1vbusDWuuEUurrwGuABXhMa71KKXU3sFxr/UL6vTOUUquBJHCr1rr+sM+mA1EbDG7ysTMUy9YhhBCiT+tsKDwITNlv3W/aWLcPrfXL7Ne8pLX+fqvnGrgl/ci6oBOsOsX6PYHuOJwQQvQ5Bw0FpdTxwAlAmVKq9R9uL+a3/z5DKUWdF1zJFDZLzgzkFkKIQ9JRTcEO5Ke387Ra3wxcnK1CZUvMqihKpPCFpflICCHactBQ0FovBhYrpf6itd7aTWXKmpgNHIEEvrCMUxBCiLZ01Hx0v9b6G8BvlVIH3JlGa31e1kqWBVGbefVRXUBqCkII0ZaOmo/+ll7+ItsFyTaFImIDRzyOLxxHa41SbY2vE0KI3NVR89GK9MR2X9VaX9lNZcqaQB44QxGSSXNSPLejsxdfCSFEbujwMpz07KhlSil7N5Qnq8J2hZFKYUslaAhKE5IQQuyvs1+VtwBLlFIvAMGWlVrrX2WjUNkSNme6wJWIUBuIUlns6tkCCSFEL9PZUNiZfhjse2lq36Eg4DSfemJhGqSzWQghDtCpUNBa/zDbBekOzemKQWHUT5NcliqEEAfo7J3XyjCnzB4LOFvWa61PzVK5sqLJbV5tVBgNUOuP9nBphBCi9+nsfA9PAGuBYcAPMfsYlmWpTFmhUDS7zef9UyF2+cI9WyAhhOiFOhsKJVrrR4G41nqx1vpaYGYWy5UV/jzQStE/FaYpJM1HQgixv86GQstf0F1KqXOUUpMxb5rTd3y+mJShCLkMyqPNNMr02UIIcYDOXn30Y6VUAfBNzCmzvcD/ZK1UWdC/+iMA9nhT9AvWs9sX6eESCSFE79PZq49eTD/1AadkrzjZkzf2Qq5+8Tma8j0MD4TY2RSWqS6EEGI/HU2I9xvggInwWrR317VeSSkMDcE8yKsNEIwlaQrFKXL3+YHaQgjRZTqqKSzvllJ0C4UCfG6FPdAMWrOjKSyhIIQQrXQ0Id7j3VWQrFMKhaY5D1QijisRpboxzLiKgp4umRBC9Bqdup+CUuqftNGM1Lfup5CuKaRHNRdEA1Q3hnq0REII0dvkzP0UUAoD8KUHsA1MBtnRJAPYhBCitQ7vp5BeLu6e4mRfQzoUhlvN5iMhhBB7dWrwmlLqXKXUR0qpBqVUs1LKr5RqznbhupZ59VFTvvmqkjA7JBSEEGIfnR28dj9wIfCZ1rrdS1R7NZXuU8jTYLMxMNYsfQpCCLGfzk5zsR1Y2WcDAQCFgUYbCtuAAZQF6mmOJPBHZA4kIYRo0dmawreBl5VSi4HMnNN96s5rrUYu2wZXUrBjN1RCdWOY0QNsPVgwIYToPTpbU7gHCGHeS8HT6tGHmM1HALYhQ7Dv3gla83lt8KCfEkKIXNLZmkKx1vqMrJakGxjpxi/bkMGocIjSeIBVO32cM2FAzxZMCCF6ic7WFBYppfp2KKhWNYXBgwGYaQ/xabWv58okhBC9TGdD4b+AV5VS4b58SWpLKFiHVAIw2fDzaXUTfbr/XAghulCnQkFr7dFaG1rrPK21N/3a29HnlFLzlFLrlFIblVK3H2S7i5VSWilVdSiFPyQKVHqmDmNAP5TNxjER8wqk7Q0yXkEIIaDjuY9Gaa3XKqWmtPW+1vrfB/msBXgIOB2oBpYppV7QWq/ebzsPcDPwwaEW/tCovQlosWAfPpyyumoYOINPqpsYXOLK7uGFEKIP6Kij+RbgeuCXrda1bms59SCfnQ5s1Fp/DqCUego4H1i933Y/Au4DvtWZAh82pVDpkms0ztGjiS9ejGuIwYebG/jCxIFZPbwQQvQFHTUf/Ukp1V9rfYrW+hTgL0AAWAlc3MFnKzAHvbWoTq/LSN/rubLVnd2yaO84haROkjdxAqnGRk4rSrH08/rsH14IIfqAjkLhYSAGoJSaDfwEeBzztpyPdPDZtu5zmallKKUM4NeY930++I6Uul4ptVwptby2trajzdvlN8zTTaVSOCdMAOBUatlYE2BznYxXEEKIjkLBorVuSD+/FHhEa/3/tNbfA47t4LPVQGWr14OAna1ee4BxwFtKqS3ATOCFtjqbtdaPaK2rtNZVZWVlHRy2HUpRmkwCkCKFc8QIlN3OhMAOlILnPtpxePsVQoijSIehoJRq6XeYC7zR6r2O+iOWASOUUsOUUnbgMuCFlje11j6tdanWeqjWeijwPnCe1jpLtwDd29Gc0imU3U7e5Mnw7+UcP7yE5z7eIZemCiFyXkeh8CSwWCn1PBAG3gFQSh2L2YTULq11Avg68BqwBnhaa71KKXW3Uqr779jWavBaSqcAcE2dQnT9ei4cVcTW+hAfb2/q9mIJIURv0tFNdu5RSr0ODAD+1WqWVAO4qaOda61fBl7eb93329n25M4U+PCZs6RCq1CYPgN+93tOCm7FYTV47qMdTB5clN1iCCFEL9bh4DWt9fta62e11sFW69YfbIxCr6RUZu6jlmzLmzIZlZeH/vB9ThvTj39+uot4MtWDhRRCiJ7V2WkujgKt+hQw//Abdjvu6dMJvLuECyZV0BCM8c6Gw7+6SQgh+rocCgX26Whu4Z41i/i2bZzgjlHosrFwRXXPFE4IIXqB3AkFpVDpZqPWVxm5TzwRgMjri7hk6iBeW7WHHU0yF5IQIjflTii0aj5K6mRmrWP4MJwTJuB78Z9cM2sYAH99b0v3F08IIXqB3AkFtTcU9h+P4D3rLKKr11DWtIezxvXniQ+20RiMdX8ZhRCih+VOKHDgOIUW3rPmgWHQ9Pzz3Dx3BKFYgvsXre/+IgohRA/LnVBQCiNdQ/jh0h/y+tbXM2/Z+vfHffzxND//AiNK8vjyjCH8/YNtrN3dx+4jJIQQRyh3QqGgkrGxGNMjUdY0rOGlzS/t83bhZZcS37kT34svcsvpx1GQZ+ObT39CLCHjFoQQuSN3QsHmpGL6f/ForY9KTyXJVHKftz2nnYb92GNo/OvfKHTZ+OmF41m1s5lf/t+6HiqwEEJ0v9wJBQDDAqkkFmU5oF9BKUXxlVcSWb2a4Ntvc8bY/lwxYzCPvP05722s66ECCyFE98qtUFAW0EkshmWfy1JbFHzxi9gqK6n51a/RqRTfPWc0w0rd3PTkR2yR+y0IIXJAboWCYQGdwqKMA2oKAIbDQdnNNxFdtw7/a6/hslv549VVpLTmykc/YE9zpAcKLYQQ3Se3QkFZADCU0WZNAcB79tk4Royg9oEH0YkEx5Tl85f/mE5jMMZVj35AU0jGLwghjl65FQrp23FaaLumAKAsFsq+8d/EtmyhaeFCACZWFvLH+VVsqQ9xzZ+XEYgmuq3IQgjRnXIrFDpRUwDIP/VUXNOnU/Pr+0nUmZ3MJxxTym8vn8xnO3x86eGl0pQkhDgq5VYoGGYoWFD4Y/52N1NK0f8H30dHo+y45ZvohFkzOGNsf/40v4qt9UEu/N17fCJ3ahNCHGVyKxTC5h9xQynWN64nFA+1u6njmGPof9cPCH34IbUPPJBZf8rIchbccDwAFz/8Hr97ayPJlNzbWQhxdMitUPAMAODEftMAaI4dfBqLwgsuoPCyS6n/45/wL1qUWT+uooCXbj6R08f0475X13H5I++zYU/7NQ8hhOgrcisULDYASu2FAIQTHd83od8dd+AcP56dt3+H2JYtmfWFLjsPXTGFn188gXV7/Jz94Dv89JW10gkthOjTcisUDCsAzvQykui4s9iw2xn0wP0oq5Xqm24mFdrb5KSU4pKqSt745hzOn1TBw4s3MfeXb/H/VlSTkiYlIUQflJOh4EhfhRRNRjv1MdvAgQz8xS+IbtzIjlu/jU7ue+VSSb6DX1wykWe+dgL9vU6++Y9POOc37/L6mj0H3LtBCCF6sxwLBTMMnIbZjBRJdv6y0vwTZ9HvjjsIvP46O771LXQ8fsA2UwYX8ezXZnH/pZMIRhN85fHlnPXAOzzz72riSZltVQjR++VmKNRtBODfe/7NtuZtnf42X3zVlZR98xb8r7zKzttuz1yqus8hDMUFkyt4/Ztz+MUlE0mmNLc8/Qkn/exNHli0gRq/jG8QQvReqq81b1RVVenly5cf3oc3vg5/v5A9FgtnDK6g5bv7z+f8nHlD53V6N/V/+hM1v/gl+aecQsX9v8ZwONrdNpXSvLW+hj8v2cI7G+qwWZQ5A+v0wRw/vATDUO1+VgghuopSaoXWuqqj7XKrpjD8FPjKIvp5K3neNpJfnfwrAHYHdh/Sbkquu45+3/sugTffZOvVVxPfU9PutoahOHVUP/72lRm88c05XH38UN7dUMeX//QBJ933Jr/61zo21QaO6LSEEKKr5FYoGAZUTgNnIUO1Yu7guQAEE4c+LXbxl79MxYMPEN2wkc0XX0Too486/Mzwsny+d+4YPrhjLg9cNonhZW5+++ZG5v5yMef+5h0eXryJ7Q3tD6gTQohss/Z0AXqExQbJOIYyKHIUURuqPazdeM84A/vQoVT/19fZdvV8+t15J4WXfgmlDt4k5LRZOH9SBedPqmC3L8KLn+7kn5/s5KevrOWnr6xlfEUBZ47tx6mj+jF6gKfD/QkhRFfJrT6FFo+dZXY6X/Mi81+ZD8DjZz1+2LtLNjWx41u3Enz3Xbxnn0X/u+6gHwcuAAAgAElEQVTC4vUe8n62N4R4+bNdvLxyd2ZepYrCPE4dVc4po8qYObwElz03c1wIcWQ626eQm39hLFbY/DakUgwvHM7C9QvZHdxNf3f/w9tdYSGVj/yB+j/+idoHHyS4bBkDfvQjPCeffEj7qSx2ccOcY7hhzjHU+CO8ubaGRWtqWLiimr+9vxW7xaBqaBEzhpVQNbSISZWFuB25+SsUQmRHbv5FSc+BRGAPJ1WcxML1C3m7+m2+NPJLh71LZRiU3nA97lmz2HXHHVT/540UXHAB5bd9G2tR0SHvr9zj5NJpg7l02mAi8STLtjSweF0t726s4/7X16M1GApGD/BSNaSIKUOKqBpaTEVh3mGfgxBCZLX5SCk1D3gAsAB/0lr/dL/3bwGuAxJALXCt1nrrwfbZJc1Hq56Ff1wDNy4lWTaSmf87kzOGnsE9J95zZPtN07EYtb/7HfV/ehRLQQHlt9xCwRcvQBld06/vC8f5aFsjK7aaj4+3NxGKmaOsBxQ4zYAYUsTUIUWMHuDFZsmt6wmEEAfq8eYjpZQFeAg4HagGlimlXtBar2612UdAldY6pJS6EbgPuDRbZcpweMxl1I/FsDC1/1RW168++GcOgbLbKf/GN/DOm8euH/yAXXfeSeOTT1L+7VtxTZt2xB3HBXk2Th5ZzskjywFIJFOs3e1n+ZYGVmxrYsWWBl76dBcAeTYLEysLqBpSzNQhRUwZXESBy3bE5yiEODpls/loOrBRa/05gFLqKeB8IPPXV2v9Zqvt3weuzGJ59nIUmMuVCyEZY0zRaJbsWMKzG56l0FHI+LLxlOaVHvFhnKNGMfSpp2h+8UVqfvFLtl09H9fMmZTf8j/kTZhwxPtvYbUYjKsoYFxFAdfMMtftbApnahL/3tbI7xdvytz3YWiJi7EDCxhb4WXcwALGDvRSkt/+ADwhRO7IWvORUupiYJ7W+rr066uAGVrrr7ez/W+B3VrrH7fx3vXA9QCDBw+eunXrQVuYOhaohQcmQPomO0tO/Sb/ufkfmbdnDZzFw6c/fGTH2E8qHKbp6aepe/gPJBsbyZ87l9L/vIG88eO79DjtCcUSfLLdx4qtDazc0czqXc1sazUmYmCBkzEDCxgz0MuYAR5G9vcyuNiFRUZcC3FU6GzzUTZD4RLgzP1CYbrW+qY2tr0S+DowR2t90KlLu6RPASDcCE3b4Q8nwcnfoW7GdTTHmrlv2X0s372ct770Fvn2/CM/zn6SgSANj/+Fhsf/Sqq5GfcJx1P8la/gPuGEbh+P4AvFWbXLx6odzXy2w8fqXc18XhugZdZvp81gRLmHUf09jOzvYUQ/DyPK8xlQ4JSxE0L0Mb0hFI4H7tJan5l+/R0ArfVP9tvuNOA3mIHQ/nwRaV0WCi1+OQqGzIKLHwVgVf0qLnvxMv5j3H9wy9Rbuu44+0kGgjQ99ST1jz9OsrYOx4hjKbriCrxf+AKW/K4Po84Kx5Ks3+Nn3W4/69LLtbubqQvEMtu47RaOKc9neKmbY8ryGVbmZmiJm2GlbrlEVoheqjeEghVYD8wFdgDLgCu01qtabTMZWIjZzLShM/vt8lB48gpY9xJ84zMoHAzA7e/czkufv8R3pn+HK0Zf0XXHakMqFqP5xZdo+PvfiK5eg3K58J41j6JLLsE5cWKv+UZeH4iysSbAhpoAG/b42VgbYEtdiB1N+969rtzjYHCxi8piF5VFeQwqdlFZ5KKyOI8BBXnSHCVED+nxUEgX4mzgfsxLUh/TWt+jlLobWK61fkEptQgYD+xKf2Sb1vq8g+2zy0Nh5f+DhdfCqd+F2bcCsCuwi+v/73q2NG/hobkPMXvQ7K47Xju01kQ++4ymf/wD34svocNh7EOH4j33XLznnI1j2LCsl+FwhGNJNtcF2VwXZEt9kC11QbY3htjeEGaXL0zrG9BZDcXAwjwqi/MYXOxiUNHe8KgsdlHitveaEBTiaNMrQiEbujwUAB45BVIJ+M93Mqt8UR9XvHQFvpiPhV9YeNijnQ9HMhCg+ZVXaH7xJUIffgha4xwzxgyIs8/C1r/7ynIk4skUO5vCbG8Ip4MixPbGMNsbQlQ3hvZpkgJw2S0MKspL1yxc5vNWNQ2PUy6lFeJwSSgciiUPwv99DwZOAU9/GHcRjL+Yrc1bueSfl+Cyujim8BjyrHmMLhnNjRNvxFDdMyAsvmdPJiAiK1eCUuRNmkT+KaeQf/IcHCNG9Nlv16FYgup0SGxrCO0THtWNYQLRfW9iVOSyZUJiULEZHhWFeQwodDLAm4c3z9pnfxZCZJuEwqGIBeHlb0PDJti2FNxl8N+fgN3Nkh1LeGrtUzTHmqkJ1VAdqOZLx32J22fcjs3o3m+usS1b8L38MoFFrxNZbQ73sA0ciHvObPJPmo1r+rQe7aTuSlprmkLxTFPU/jWNHY1hYvvd4jTPZqF/gZN+XgcDCvLoX+Ckv9dJP6+T/gVOBhQ4KXHbscoIb5GDJBQO19b34M9nwejz4PyHwLl3tlOtNb9e8Wv+vOrPDPEO4bZpt1HVv4o8a/fPNxTfs4fA4sUEFr9NcOlSdCgEFgvOsWNxz5iBa8YMXFMmY7hc3V627pBKaWr8UXY0hdnti7DLl142R9jtMx97miMkUvv++zYUlOQ76O91Uu5xUJ5ZOij3OCnzOMxHvgO7VcJDHD0kFI7EGz+Gt38O3gq45iUo3reT941tb3DvB/eyJ7SH8rxyvjH1G5w17CysRs9cjpmKxQj/+yNCH35A8P0PCH/6KSQSYLORN2GCGRIzZ5A3aRKG3d4jZewJqZSmLhhljy/K7uYIu5sj1DZH2NNsvq7xR6lpjlAfjLX5+SKXjXKPk3KvGRKZwEiHRml6WeiySbOV6PUkFI6E1rDuFXjmerDlwRULoN848+Y86f/8vqiPJTuW8PCnD7PZt5ljC4/l9um3M6FsAnbDjsWwZLeMB5EKBgm1ConIqlWQSqEcDvImT8ZVVUXehPHkTZiApbCwx8rZW8STKeoCUer8MWr8ZmjU+qPU+NPB4Y9S5zfX7d9kBWCzKErcDko9dkrzHXufux2U5NspyXdQ4jbfK3bbpQYieoSEQleoWQN/PR8Ce8zXyoCSEXDWz+CYUwBI6RT/2vIvfr3i1+wM7sx81GpYOa7oOL5V9S2q+lX16DfJpN9PaNlyQh+8T/CDD4muW2cGH2CrqMA5ZjSOUaNwjh6Nc/RorP37yzffNmitaY4kMoFRF4hR64+mAyW9DMSoTy/bChAAr9OaCYiSfDvFbjM0itx2Stx2ivd7OG099wVDHD0kFLqKbwesecHsjI76YfXz0LgZxlwAJ30TykaB1U4oHuLVLa/ii/qIJCOE4iFe3vwyNaEahnqHctqQ05g3dB6DPINw29zdV/42JAMBIitXEv7kUyJr1xBdvYbYtm2ZoLAUFuIYPQrnqNE4x4zGOWoU9mHDUFYZrdxZLQHSEGwJiSj1wRh1/hgNQfN5fSBGfTBKQzBGQzBGqp3/ivkO6wFB0RIiLc8LXelAybfjcchVWOJAEgrZEo/Au7+G934D8SDk94Pp18OkL4N3wD6bhhNhXt38Ki9tfollu5eR0imshpXZFbM5YeAJnDL4FMpd5T10IvtKBoJE168nsmY10bVriaxeQ3TDBnTMbG9XDgeO447DOWrU3prFyJFHbUd2d0ulNL5wnIZQLB0ksXRYmAHSEhx717dfE7FZFEUuMzBalsWtaiJFbjvFLjtFbhslbrNPRGojRz8JhWxr3gWb3oBPnzJv7akMGHEG9BsL1jywOqDkGBhxJlis7Ars4pPaT/io5iMWbV1ETbgGQxmcWHEiI4tGYrPYsBt2nFYnVf2qOK7ouB7/tqfjcaKbNxNds4bImrVE1qwhsnYtKZ/P3EAp7EOH4hw92qxZjByJfdgwbAMGSK0iy7TWBGNJGoMx6oMxGlsHR8vr0N5lQzCGLxynvf/ubrtlv+YrB8VuW9tLl13GhPRBEgrdqX4TfPQ3+GQBBHaDbvUNzjMQRp0Ng6bD0FngrUADm5o28fLml3l+0/PUh+tJ6uQ+u+zv7s+U8imMLB7J+NLxDPYMptxV3uP/EbXWJHbtMgNizdpM81N8597+FKxW7BUV2IYOwT54CPbBg7EPNZe2gQNRNhmZ3BMSyRRN4XgmQBpDMRqCcRpDZg2kMbRvwNQHo0TibddGrIbK1DiK081WbfWHlLgd6RqLTcaH9DAJhZ6UTJhNS1vehX//DTYvzty7AXs+DD8ZBk6GwTPNUdR2F8lUklgqhi/q450d7/Dejvf4tPZTasJ7J47Nt+UzuXwyxxYey7FFx2bCoievdGqRbGoiunEjsa3biG3dSmzbNmLbthLfspVUaO99G7BYsFVUYB+SDoshg7ENHmy+rqhA5dAls31BOJakPhilMRjfp//jgFpJ+rkvHG93X4UuGyVu82qs0nwzMFquzipNry9Jh0tBnlzm29UkFHqTVAr2fAbbP4Tdn5kh0bjFfM+wQtlo8xahVgfYXNB/HFROh37jqLNYWd+0nm3N29jQuIF/1/ybrc1biafM/3w2w0alp5ICRwEOiwOnxcnQgqGMLR3LcYXHMcQ7pEdDQ2tNsr7eDImt24ht3UI883wrqUBg78aGgbW8HNvAgdgqKszlwIHYBg4wl/37Y7h7tpNeHFw8mUrXQGI0BNKhEdrbF1IfjKY72M0O+MZQ2yFiNVT66qyWADEv6S1tNUakNN9Omce8BFhm3+2YhEJvF2qA6mWw7X3YsxLiYUhEzSuc6tbtbYJyFkL/8VA4xOzILhtFoqCSLXYbn/m3srl5M9ubt+OP+4kkIoQTYTb7NmdCw6IsDHAPYETRCErzSilyFjHEO4RKTyX9Xf0pd5X3WGhorUk2NhLbujUTFPEdO4jv3Gku9+yB5L7NaobbjbW8HGu/fljLy7CVl5uvy/ull+VYy8tyapBeX9YSIvWBvVdjtVzW2/K6NmB2uNf5Y4TjyQP2oRSZ0CjzOFot7emBhumpTwrzyM/h+31IKPRl4SbY/ak5TqJmNexeCc07IFADrfsevBVQMdW8AsrqMAfXWRzE8svZ5PaynjhbIrVs929nY+NGGqON+KK+ffovrIaVod6hHFt4LPn2fGyG2eFts9godhYzvGC42Z/hLsdh6d77OOtEgkRNDfFdu4jv3EV89y4SNbUkamrMx549xGtrIX7gt01LYWE6OMyQsJaXY2t5XZYOj9ISlKXnm95E5wWjib1jQwLmgMLa9HiRlvXmuiixxIH9IR6nlYEF6UkUC/IYkJ4Ta2BhXmZ5tF6JJaFwNIpHzEn7GrdC/QbY9SnsWA4RHyTjZk0jtd8fSLsHvAPNqTqchcSdBWx3F7LTbmOngupUiM9DNWzyfU4kGSGeihNLxogn4yT0vrOUFjuLKXYWM8A9gCJnER67h9K8Uspd5RQ5iijNK6W/uz+FjsJuaw/WWpNsasqERKKmhngmNGr2Bkh9vdmM15phYC0pwVpWhqW0BGtpGdaSEiwlxVhLSrGWlmApLsFaUoylqEgCpA/RWuNvCRC/Oa3JLl+EXU1hdqbnytrV1PYUJ0UuGwMK8hjYEhyFTjNI0qHRz+vsk6PSJRRyVSoFTVugdr0ZHL5q89G4FaI+s9kqFtj3M4YNioaCIx8sDrDa0YadRqeLz/O8bLdZ2W1o6nSS2lSY3VEfTXE//pifQDxwQBHyrHlU5Ffgsrn2qXl47V76ufpR5iqjyFFEobOQIkcRJXkl5NvycVqdWZuSXCcSJOrr94ZETQ3xPXvMmkd9HcnaOvP9hoY2ax4ohaWw0AyM4nRwFBVhKSrGUlyEtbjYfF5UhKWoEGthoXSa9wGReJLdvgg70yGxy5cOjaawGSK+yAGd50pBab6DgQVOBhW7GF7qZkQ/D8f1y2d4aX6vDQwJBdE2rSFYB/5d5qN5hxkYjZshFoJkFBIxSMYg3GgGyv61DzDHZdg9hPIKqHMV0OBwUWdzsMtqYYfS7CROVCliShEHYmh8yTA1kcYDaiCtFToKKc0rpdBRiNfu3Sc4ylxlOC1ObIbNDBuLHZfNlQmYrpjKXGtNqrmZRH09yfp6Myhanjc0kKxvSC/rSTQ27h2z0QbD7TZDorDQfBQVYSkoMB+FhVgKWz1Prze8XpTRO/+o5KpgNJEOCDM4drZamvcBCWVGo1sMxbBSN8f1y2dEuYfj0mExtNSNrYcvyZVQEF0jlTLDwb8LQnUQqAX/TrNDPOo3ax4RH0SazGU4vUyE294d0GwYNOQV0piXT5Mzn3pHPiGbk4ChaFKaWpL4dBKfjuNLRmlMBEnoAzsY9+e2uSmwF+Cxe/DYPbhtblxWFy6bi2JnMQWOAlw2F/m2fLx2LwWOAoqcRRQ5irBb7FiU5ZCbvXQiYTZfNTSQbGwi2dhAsrExvc5cZh6NjSSbm0k1N7e/Q6WweL0YhQVYvAVYvN50WHjM1wVeDK8389zi9WJ4C7B4PRj5+RIoPSAST/J5bZANNX7W7/Gzfo95H/OtDaHMYEGbRTG8NJ8R/fIZV1HA5MpCJlYWdmv/hYSC6FmJ6L4hEW02wyVYay5D9RBphnCDOeFg2GeO7YiFDggUDTQZBnUWCzEFcaWIG1biFjt+m51Gh4smqwOfzYbPsOA3FM1KE0IT1ikCOk5TMkKSg/9bV6hMDcRuseO1e/HavXgcHrw2byZQPHYPedY8nFZnZp3b5ibflk++3Qwcj93TblOYTiRI+v17w8LnI+XzZZ4nm1o99/vN99LP978aa98TUBj5+Vg8HgyPB8OTjyXffN6yzuLJx/B400vPPttb8vNRLpeMD+gikXiSjTWBfYJi3R4/1Y3mv2+bRTF1SBFzjivn9DHlHFvuyWp5JBRE35WM7w2MlmAJ1ZthEg/u7VRPxsxLeSNNZq0l4jM/Fwukl/7Mpb0aCCpF0DAIGIpmw8BnWGi0GDRaDDNkDEvmEbbaCVhsNFkMAkrhV5qAThIkSaQTtRYDA5ctL9PUZTVs2Cw2XFYXHrsHl82VqcV47B68di9OixOn1Xy0BI3L6sJtc5NnTe8rEscIRDACIVLNfpLNPnPpN2sgyWY/KX8zSX+AlN9PMmAuU36/GSr7d7YfUHADIz8fI99tBkp+vhku7vy9z/PzMVrey3enX+djuPe+Vnl5Ei7taAzGWLG1kQ+3NPDOhjrW7DJrjuMqvFw7axjnTBiAw9r1NQgJBSG0NoMjFjQDJeIzR5ZHA+ngSDd7tQRMMp4OnIhZs4n40s1kAfN1LAixALFUgoihCCuDkKEIKTNoAoZBwDBoNsygCStFXCkS6WXMYiNgsRG0WAgqRVgpgkoTIEWsg1pMW9zWPDw2Dx6HF4/dS54tD5fVrLm01GScViceW7pmY3HgSdnxxCy4I2AJRbGEolhDUYz0kmCIVCBIKhAgFQyY4ZIOlmQwSMrvR0ejHReudbi0BIrbbT7yzaWl9Tp3fua9zPp02Ci7/agOmF2+MP9atYe/v7+VDTUBSvMd/Ncpx3D18UO7dFCehIIQ2aC1GRzxUPoR3juteiwdNtFAOmRie8MmEUlvk9625bPpvploLEAkGSOcDBPRKYKGWatpCZyQYRBXkMAMmKhSmRpPwDAIWCyEDCtBwyBomIETQRM/xL8pDsOG2+LEbXXhtrnIs7pw2lw4bW5cdjduqxsXdlxRcMY0eZEUrrhBftyCO6ZwRFLYIwms4TjWcAxLOIYRiqRDJpRepkMnFKLdGfpas9mwtISEx4PhdplB4/HsW1PJT7/2eMyQ8bRqGnO7e/3VYFpr3tlQxx/e3sSSjfXMHF7MH66sosDVNXOFSSgI0Ve1hE4slKmdZIJkn6CJprdLbxNL98nEAukR8mHi8RCheJhwPEgoGSGQCNOcihJquTJM7Q2ZoKEIKiMTSEHDIJKu0USUGUxBwyBiGMSA5CEETp5hw2PJw2tz47Q4zH4bZceTcuBNOSnQeXgSdtxxC66Ywh1TOKMpbJEEtkgCayiKLZzAFo6jwlFUMEwqFCSVrsm0TPF+MMrhyPSd7NPP4vWY/SzeltctHfjevVeLFRR028y/WmsWrqjmjmc/Y+qQIp786swuqSl1NhRyd8y3EL2VxQaWAnAWHPGubEBB+pGRTKQDJr5vjSYW3BtG8ZBZu2lpbsuET7qmE20mGY8QS0UJJqP4kxH8iQihRIRgMkI4FSdMgpAyMrUXf7ppreVS5bBSNCpFKFMrUkQMAyxAXvrRDgW4lA2XxY7bUkiRclOSzMOTsOKOWchPWPEmneTH7bjiBnlRTV4UHJGk2VwWjKD8jRi7d6L96WaxSOSgP0vD49l7eXGrh7XYHK9iLS3BWlqKtawMa1nZYddMlFJcUlVJIqX5zjOf8dzHO/ji5EGHta/DIaEgRK6xWMHiPfLdsPdvd2lbG6SSe4MkHmrVtJYeC5MI7w2gdE0oEfUTivoIxfwEYwFi8RCxVJRoMkZzMoovGSWQiuJPxc1mMsO8EMBnMdhlGGxJ12oiNoOgw3y/M/KVlaKUl+K4laKYleK4k+Kkk6K4A2/MjjtikBfROEMp7MEYtrpdWD7fhG7ykQoG2/75lJRg7VeemdjRPqgS+5DB2I85FlvFwA6//V9aVclTy7Zz78trOW10PzzO7plyXkJBCJEdhgWcXvPRSVbAm34cVCplhko0kKm5EAuaTWotYRPzEw83EYo2EYg20xz10ZQIEk1EiSRChOMhgokQ/lSM5lQIH5qQoQgbio155sUCPsPAbxjog/wBz0/YGBixMShipzxko1/EQVnYQVHQgqs5inPDGixLlkB4b03EOmAA7unTcE2fjmv6dOyVlQf++AzFj84fy3m/XcKf3tnM/5x+XKd/jkdC+hSEEAL2Bk0saF4Gnb4kOhluJBRpJBhpxB+qxReqozbaQH3Mjz8RJpiM0pSK0kiSZsOgzmJQa7EQbV1L0RpvCEY2GIypszK62krF1ggOvzlbgOvk2Qz62X1YCg5sMpz/2IdsrAnw7m2nHFHfgvQpCCHEoTAMsLvNR/7ee6dbAE/60f9gn08lzcuYg3WkArvxBXbT5NvKnuZt7A7toc6opdruY1NZiDfGwS6LhX4NFqav11zy9tu8evXJpO6Yz+lTbsBp29uhcu6EAdy68FM+rfYxsbIwSye/l4SCEEJ0BcMCrmJwFWOUHUcRUAQM2387rSHUQLJxM9U7l/PZMUtZafmUSW9E+OP//pH71jzKdZXzuOrUn2Eog9NG98NQ8Mbamm4JBZkoRQghupNS4C7BMqiKIdP/k3MveJzLfrsC17SpfOU9G0Niml9Uv8r3nj6bZDJBkdvOpMpC3lpX0/G+u0BWQ0EpNU8ptU4ptVEpdXsb7zuUUgvS73+glBqazfIIIURvpAyD4q9ch+GP8rthv+JrrmN4IbKDHzx9FqlUkhNHlPHZDh+BaPszDHeVrIWCUsoCPAScBYwBLldKjdlvs68AjVrrY4FfAz/LVnmEEKI3y581C6OggMDit7nx4me5MX8kz8d2c+/C8xg/wENKw/o9/qyXI5s1henARq3151rrGPAUcP5+25wPPJ5+vhCYq47mSU6EEKIdymbDOWY00fUbQClu/OLT/IdrOAvC21j88TU4VJD6QMcjt49UNkOhAtje6nV1el2b22itE4APKMlimYQQotdyHHMssY0b0VqjDIP/uehZrnEdw/PJnZSP+CGrV2a/MSWbodDWN/79B0V0ZhuUUtcrpZYrpZbX1tZ2SeGEEKK3cU2fRv5pc9Fh854LyjD45iXP8fuxX2dsqpDh/Y7NehmyNnhNKXU8cJfW+sz06+8AaK1/0mqb19LbLFVKWYHdQJk+SKFk8JoQQhy6zg5ey2ZNYRkwQik1TCllBy4DXthvmxeA+ennFwNvHCwQhBBCZFfWBq9prRNKqa8Dr2EOCnxMa71KKXU3sFxr/QLwKPA3pdRGoAEzOIQQQvSQrI5o1lq/DLy837rvt3oeAS7JZhmEEEJ0noxoFkIIkSGhIIQQIkNCQQghRIaEghBCiAwJBSGEEBl97s5rSqlaYOthfrwUqOvC4vRWuXCeuXCOkBvnKefYPYZorcs62qjPhcKRUEot78yIvr4uF84zF84RcuM85Rx7F2k+EkIIkSGhIIQQIiPXQuGRni5AN8mF88yFc4TcOE85x14kp/oUhBBCHFyu1RSEEEIcRM6EglJqnlJqnVJqo1Lq9p4uT1uUUpVKqTeVUmuUUquUUv+dXl+slPo/pdSG9LIovV4ppR5Mn9OnSqkprfY1P739BqXU/FbrpyqlPkt/5sGW25+2d4wsnqtFKfWRUurF9OthSqkP0sdfkJ5uHaWUI/16Y/r9oa328Z30+nVKqTNbrW/zd93eMbJ0foVKqYVKqbXp3+fxR+nv8X/S/1ZXKqWeVEo5j4bfpVLqMaVUjVJqZat1Pfb7O9gxupzW+qh/YE7dvQkYDtiBT4AxPV2uNso5AJiSfu4B1gNjgPuA29Prbwd+ln5+NvAK5h3sZgIfpNcXA5+nl0Xp50Xp9z4Ejk9/5hXgrPT6No+RxXO9Bfhf4MX066eBy9LPHwZuTD//GvBw+vllwIL08zHp36MDGJb+/VoO9rtu7xhZOr/HgevSz+1A4dH2e8S8ne5mIK/Vz/eao+F3CcwGpgArW63rsd9fe8fIyu81WzvuTY/0D/+1Vq+/A3ynp8vViXI/D5wOrAMGpNcNANaln/8BuLzV9uvS718O/KHV+j+k1w0A1rZan9muvWNk6bwGAa8DpwIvpv+h18H/b+9cQ6yqojj+++f46EGavVCUTDIhe2hKjY9I0owkimpCQ/JREEQR1ocgjCAo6EOEqD0gU8siw5QKMVQqrcTEB+arMiGrSfPxQbPUcnL1Ya97vY7nXmeGOw/vrB8c7j3r7H32WrOGs85+3LWpqu8v0n4cQ/17lZdTfR/myhXzdak2msG+C0R/vBcAAAXNSURBVEkPS9WTV5ofc3usd3ffLAHuqBRfAn04NSi0mv+KtdEcfm0vw0e5f94ctS5rs3jXehCwFrjczPYA+OdlXqyYXaXktRlySrTRHEwHngFO+PnFwEEzq8vQK2+LXz/k5Rtre6k2yk1fYD8wV2mIbLak86kwP5rZ78ArwK/AHpJvNlBZviykNf3XYs+w9hIUlCFrs8uuJF0ALAKmmtmfpYpmyKwJ8hZD0l3APjPbUCjOKGpnuNaWba8iDT28YWaDgL9JQwHFaMu2FMXHu+8hDfn0BM4H7swoejb7siG0hP4tZnN7CQq1QO+C817A7lbSpSSSOpICwvtmttjFeyX18Os9gH0uL2ZXKXmvDHmpNsrNcOBuSbuABaQhpOlAN0m5nQAL9crb4te7krZubaztB0q0UW5qgVozW+vnH5GCRCX5EWA08LOZ7Tez48BiYBiV5ctCWtN/LfYMay9BYR3Qz1csdCJNcn3ayjqdhq9AeBv43sxeLbj0KZBbuTCJNNeQk0/0lQnVwCHvci4Dxki6yN/mxpDGXPcAhyVVe1sT690rq42yYmbPmlkvM+tD8sMXZjYB+BKoKWJjTq8aL28uH+8rWq4E+pEm7zJ97XWKtVFuG/8AfpPU30WjgO1UkB+dX4FqSee5Hjk7K8aX9WhN/xVro/w0x0RFWzxIs/c7SKsZprW2PkV0HEHqEm4GNvkxljSG+jnwk3929/ICXnObtgBDCu71MLDTjykF8iHAVq8zi5M/YMxso5ntHcnJ1Ud9SQ+CncBCoLPLu/j5Tr/et6D+NLfjR3z1RilfF2ujmWwbCKx3X35MWn1ScX4EXgB+cF3mk1YQnfW+BD4gzZMcJ72lP9Ka/ivVRrmP+EVzEARBkKe9DB8FQRAEDSCCQhAEQZAngkIQBEGQJ4JCEARBkCeCQhAEQZAngkJQEUiappStc7OkTZJubmT9yZJ6NrJOn8Ismk2lXPcJgnJQdeYiQdC2kTQUuIuUYfYfSZeQsmo2tH4HUnbPrbTRX7oHQUsRPYWgEugBHDCzfwDM7ICZ7QaQNMqT0m1RypHf2eW7JD0v6RtSlsohwPveyzjX892vkrRB0rKC1AODJX0naQ3weJYySvn9xxacz5N0v/cIvpa00Y9hGXUnS5pVcL5E0kj/PkbSGq+70HNkIellSdu9l/RKOf6gQfslgkJQCSwHekvaIel1SbcCSOoCzAPGmdl1pJ7xYwX1jpnZCDN7j/Tr4wlmNhCoA2YCNWY2GJgDvOR15gJPmtnQEvosAMa5Dp1I6R+WkvLY3G5mN/r1GQ010Hs/zwGjvf564GlJ3YF7gQFmdj3wYkPvGQRZRFAIznrM7C9gMPAoKWX1h5ImA/1JCdt2eNF3SJun5PiwyC37A9cCKyRtIj2Me0nqCnQzs1Vebn6R+p8Bt3mv5E7gKzM7CnQE3pK0hZSa4ZpGmFnt5Ve7TpOAK4A/gWPAbEn3AUcacc8gOI2YUwgqAjP7D1gJrPSH7iRS7qhS/F1ELmBb/d6ApG40IF2xmR2TtJK04cw4Uh4dgKeAvcANpBeyYxnV6zj1Za1LgU4rzOzB05SVbiL1RsYDT5AyzwZBk4ieQnDWI6m/pH4FooHAL6REbX0kXeXyh4BV9es7h0lboEJKynapT2AjqaOkAWZ2EDgkaYSXm1BCrQXAFOAWUrZMSKmi95jZCdelQ0a9XcBASedI6g3c5PJvgeE5Wzwz6dU+r9DVzJYCU932IGgy0VMIKoELgJn+Jl9Hykj5qL+xTwEWKuXeX0fazzeLecCbko6StnesAWb4kFEVac+HbaQH/RxJRzj5sM9iOfAuKdXzvy57HVgk6QFS6uesnspq0laeW0iroTYCmNl+HxL7IDdZThrWOgx84vMnIvVGgqDJRJbUIAiCIE8MHwVBEAR5IigEQRAEeSIoBEEQBHkiKARBEAR5IigEQRAEeSIoBEEQBHkiKARBEAR5IigEQRAEef4H4Gx6Yt7iwV0AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "for similarity_heuristic in similarity_heuristic_list:\n",
    "    W_sparse = similarity_dict[similarity_heuristic]\n",
    "    \n",
    "    pyplot.plot(-np.sort(-W_sparse.data), label=similarity_heuristic)\n",
    "    \n",
    "    \n",
    "pyplot.ylabel('Similarity')\n",
    "pyplot.xlabel('Sorted values')\n",
    "pyplot.legend()\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([    0,     0,     0, ..., 10676, 10676, 10676], dtype=int32),\n",
       " array([  12,  310,  312, ..., 5645, 5950, 8485], dtype=int32))"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "W_cosine = similarity_dict[\"cosine\"]\n",
    "W_cosine.nonzero()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1043332, 1000479, 1000478, ...,     393,   47637,   33940],\n",
       "      dtype=int64)"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cosine_sorted_coordinates = np.argsort(-np.array(W_cosine[W_cosine.nonzero()]).ravel())\n",
    "cosine_sorted_coordinates"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([9.9999994e-01, 9.9999994e-01, 9.9999994e-01, ..., 1.4800464e-03,\n",
       "       1.0818754e-03, 9.5912459e-04], dtype=float32)"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "W_sparse = similarity_dict[\"cosine\"]\n",
    "similarity_values = np.array(W_sparse[W_cosine.nonzero()]).ravel()\n",
    "similarity_values[cosine_sorted_coordinates]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEKCAYAAAD9xUlFAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzsvXt8FOXZ//++dzcHQkJCCASRo5ZIwACRgCii2ADaikULlaf1gAq13+dX69PHaitaK56qr2qfqo88rRY8ltYoCB5qK8pBkaIEGosCCqKcGgmEHMg52d3798fszM7MzuwpuwmQ+bxeeWV39p6Ze2Znr+u+Tp9LSClx4MCBAwcOAFzdPQEHDhw4cHDiwFEKDhw4cOBAg6MUHDhw4MCBBkcpOHDgwIEDDY5ScODAgQMHGhyl4MCBAwcONDhKwYEDBw4caHCUggMHDhw40OAoBQcOHDhwoMHT3ROIFXl5eXL48OHdPQ0HDhw4OKmwbdu2aill/0jjTjqlMHz4cLZu3drd03DgwIGDkwpCiP3RjHPcRw4cOHDgQIOjFBw4cODAgQZHKThw4MCBAw0nXUzBgQMHPQ8dHR0cOnSI1tbW7p7KCY/09HQGDx5MSkpKXPs7SsGBAwcnPA4dOkRWVhbDhw9HCNHd0zlhIaXk2LFjHDp0iBEjRsR1jKS5j4QQzwghjgghPrX5XAghnhBCfCGE2C6EOCdZc3HgwMHJjdbWVvr16+cohAgQQtCvX79OWVTJtBSeA54EXrD5/FvAyMDfucDvA/+Tgo8LC0kJNJlr88A5n+5K1qkcOHCQBDgKITp09j4lzVKQUr4P1IQZMht4QSr4EMgRQpyWjLl8XFhIqgSB8pfuhX+eXZiMUzlw4MDBSY3uzD46HTioe38osC0EQoibhBBbhRBbjx49GvOJVAtBVQoAad6YD+PAgQMHcWHr1q3ccsst3T2NqNCdgWYrG0daDZRSPg08DVBSUmI5Jhw6BKRK48HbnBC7AwcOugglJSWUlJR09zSiQndaCoeAIbr3g4HKZJzoitmPYjYMVk/+QTJO5cCBgxME2/bXsmT9F2zbX5uQ473wwguMHTuWcePGce2117J//35KS0sZO3YspaWlHDhwAIBXXnmFs88+m3HjxnHhhRcCsGHDBmbNmgXA4sWLufHGG5k2bRpnnHEGTzzxhHaOP/3pT0yaNInx48fzox/9CJ/Pl5C5x4LuVAqvA9cFspAmA/VSyq+TdbJWdxoQNE9mbV6ZrFM5cOCgm7Ftfy1XL/2Q3675nKuXfthpxbBjxw4efPBB1q1bx7/+9S8ef/xxbr75Zq677jq2b9/O1VdfrbmH7rvvPt5++23+9a9/8frrr1se77PPPuPtt99my5Yt3HvvvXR0dLBr1y7KysrYtGkTH3/8MW63m+XLl3dq3vEgaU4UIcRfgGlAnhDiEHAPkAIgpfwD8BbwbeALoBm4IVlzAcjwtYd978CBg1MHH355jHavH7+EDq+fD788xoRhfeM+3rp165g7dy55eXkA5ObmsnnzZl599VUArr32Wn7+858DMGXKFK6//nquuuoqvvvd71oe77LLLiMtLY20tDQGDBhAVVUVa9euZdu2bUycOBGAlpYWBgwYEPec40XSlIKU8vsRPpfAj5N1fj32PXwZKzc8TmHdQS2u8HnOYM7uipM7cOCgyzH5jH6kelx0eP2keFxMPqNfp44npYyY6ql+/oc//IGPPvqIv/71r4wfP56PP/44ZGxaWpr22u124/V6kVIyf/58HnrooU7NtbPoMdxHP5v2X3zdqy8S+LpXX3427b+6e0oOHDhIEiYM68vyhZO5deZZLF84uVNWAkBpaSkvv/wyx44dA6Cmpobzzz+fl156CYDly5dzwQUXALB3717OPfdc7rvvPvLy8jh48KDtcc3nWLFiBUeOHNHOsX9/VGzXCUWPycGZdeAjTmtR/IqntdQy68BHwGXdOykHDhwkDROG9e20MlAxZswY7rrrLi666CLcbjfFxcU88cQT3HjjjTzyyCP079+fZ599FoDbb7+dPXv2IKWktLSUcePG8d5770U8x+jRo3nggQeYOXMmfr+flJQUlixZwrBhwxJyDdFCKF6ckwclJSUyniY7H829hqxPtyFQUlO9mVkMuf1n9J03L+FzdODAQWKxa9cuCgudgtNoYXW/hBDbpJQR82J7jPuorNeZQLBWwdPYwOF7FlNbVtZ9k3LgwIGDEww9Rim8evokHh8/h+MpGUAwNbVhzTvdNykHDhw4OMHQY5RCTi8Pbw8/j2fHfAsIWgxZM2d036QcOHDg4ARDjwk0TztrAKs/ruTt4ecBMKdhNxOvm+PEFBw4cOBAhx6jFDbsDhLpvT38PD7KuJCP583sxhk5cODAwYmHHuM+qmvuCPvegQMHDhz0IEsB4JJ9m7mg8hM+GFSkuZEcOHDgIFYsXryYzMxMjh8/zoUXXsj06dO7e0oJQ49RCpfs28x/fayQ4E04sjuw1Slec+DAQfy47777unsKCUePcR9dUPkJEExFVd87cODgFMXBLbDxt8r/BODBBx/krLPOYvr06Xz++ecAXH/99axYsQKA8vJyzj//fMaNG8ekSZNoaGjA5/Nx++23M3HiRMaOHctTTz2VkLkkEz3GUtg0qIgJR3ZrqaibBhVxbbfOyIEDB0nDwS3w/HfA1w7uVJj/OgyZFPfhtm3bxksvvURFRQVer5dzzjmHCRMmaJ+3t7czb948ysrKmDhxIsePH6dXr14sW7aM7OxsysvLaWtrY8qUKcycOZMRI0Yk4iqTgh6jFD4dfzGPgxZT2DH+4u6ekgMHDpKFfRsVhSB9yv99GzulFDZu3MiVV15JRoZS/Pqd73zH8Pnnn3/OaaedptFe9+nTB4A1a9awfft2zZqor69nz549jlI4EXCorpVDw88LBpjrWrt3Qg4cOEgehk9VLATVUhg+tdOHDEedbUetLaXkf//3f7nkkks6ff6uQo+JKThw4KAHYcgkxWX0zbs67ToCuPDCC1m1ahUtLS00NDTwxhtvGD4fNWoUlZWVlJeXA9DQ0IDX6+WSSy7h97//PR0dSgr87t27aWpq6tRcko0eYyk4cOCgh2HIpE4rAxXnnHMO8+bNY/z48QwbNoypU42WR2pqKmVlZfzkJz+hpaWFXr168e6777Jw4UL27dvHOeecg5SS/v37s3r16oTMKVnoMdTZP32pgtUfV2q1Ck2TpvL/Hr0tCTN04MBBouFQZ8eGzlBn9xhL4c3tlYZaBd7cTe3EIQ73kQMHDhzo0GNiCl4//CSgEBzabAcOHDiwRo9RCqtX/1y7WIc224EDBw6s0WOUQgp+IGglSHBcRw4cOHBgQo9RCv7Af31Y3WnF6cCBAwdG9BiloF6o0P0/fM9i9l42y1EODhw4cBBAj1EKLa4UIGgpqMqhfe9eDt+z2FEMDhw4iIjzzz+/W8+/YcMGZs2aldRz9BilMG/2QzS7UjSlYK7OcDKRHDhwEAn/+Mc/uvR8Pp+vS88HPUgp+CT8cex3sGMvcTKRHDg4tfDxkY9Z+slSPj7yccKOmZmZSWNjI6WlpZxzzjkUFRXx2muvaZ+/8MILjB07lnHjxnHttQoPc1VVFVdeeSXjxo1j3LhxmmK54oormDBhAmPGjOHpp582nONXv/oV5557Lps3b+bvf/87o0aN4oILLuDVV19N2LXYoccUrwFcsXcjgEExuHJyGPDfP3UykRw4OIXw8ZGP+eGaH9LuayfVncofZ/6R8QPGJ+TY6enprFq1ij59+lBdXc3kyZP5zne+w86dO3nwwQfZtGkTeXl51NTUAHDLLbdw0UUXsWrVKnw+H42NjQA888wz5Obm0tLSwsSJE5kzZw79+vWjqamJs88+m/vuu4/W1lZGjhzJunXr+MY3vsG8LpBTPcZSuGTfZoY1HAEU15EWW0hJ6Zb5NFdUUP3U0zRXVHTL+R04OJWxtWor7b52/Pjp8HewtSp2ahw7SCm58847GTt2LNOnT+ff//43VVVVrFu3jrlz55KXlwdAbm4uAOvWreM///M/AXC73WRnZwPwxBNPMG7cOCZPnszBgwfZs2ePNmbOnDkAfPbZZ4wYMYKRI0cihOCaa65J2HXYocdYCvrOa/p4gu/oUQ7fsxhIXN1Cc0UFzVvKyZg0kYziYsvPD9xwI7K9HZGaytBnn7Ec58CBg/hQkl9CqjuVDn8HKa4USvIjUv5EjeXLl3P06FG2bdtGSkoKw4cPp7W11ZY+2wobNmzg3XffZfPmzWRkZDBt2jRaWxU6//T0dNxutzY22mMmCkm1FIQQlwohPhdCfCGEuMPi86FCiPVCiAohxHYhxLeTNZcPBhUBoQFmFYkKNKsC/+jjj3PghhstLYHmLeXI9nbw+5EdHTRvKU/IuR04cKBg/IDx/HHmH7m5+OaEuo5AaZQzYMAAUlJSWL9+Pfv37wegtLSUl19+mWPHjgFo7qPS0lJ+//vfA0rg+Pjx49TX19O3b18yMjL47LPP+PDDDy3PNWrUKL766iv27t0LwF/+8peEXYcdkqYUhBBuYAnwLWA08H0hxGjTsF8CL0spi4H/AP4vWfOJhEQFmqMR+BmTJiJSU8HtRqSkkDFpYkLO7cCBgyDGDxjPwqKFCVUIQgiuvvpqtm7dSklJCcuXL2fUqFEAjBkzhrvuuouLLrqIcePGceuttwLw+OOPs379eoqKipgwYQI7duzg0ksvxev1MnbsWO6++24mT55seb709HSefvppLrvsMi644AKGDRuWsGuxQzLdR5OAL6SUXwIIIV4CZgM7dWMk0CfwOhuoTNZkzO6jY2lZDDq9PwhB7nXXJsx1pAp82dFhK/AziosZ+uwzYV1MDhw4OLFw7NgxcnNzycvLY/PmzZZj5s+fz/z58w3b8vPzDRlKKv72t79ZHkMNRKu49NJL+eyzz+KcdexIplI4HTioe38IONc0ZjGwRgjxE6A3MD1Zk/lgUBETjuzW3Ef92hrInf+zhGcdRSvwM4qLHWXgwMFJgsrKSqZNm8Ztt536PViSqRSsoiNml/73geeklL8VQpwHvCiEOFtK6dcPEkLcBNwEMHTo0Lgm8/bw87hi70aGNRzRrIWGNe8kJRXVEfgOHJxaGDRoELt37+7uaXQJkhloPgQM0b0fTKh7aAHwMoCUcjOQDuSZDySlfFpKWSKlLOnfv3/cE/oi+3TleIH3rty+cR/LgQMHDk5FJFMplAMjhRAjhBCpKIHk101jDgClAEKIQhSlcDRZE8ppVxpmqyaMv6Y2Wady4MCBg5MSSVMKUkovcDPwNrALJctohxDiPiHEdwLDfgb8UAjxL+AvwPUyiU2j61J7K3MLvM+aOYPasjIOLFjoEOI5cODAAUkuXpNSvgW8Zdr2K93rncCUZM5BxSX7NlN6yFgzULtiJW2fKFlJTZs2cfTJJfS/+ccO5YUDBw56LHoMzYU+JVV1H6kKQYVa3exYDQ4cOOip6DFKQV/RLLFOjVLh0GifenC4phycaPB6vd09BUv0GKVghhpXSCsqCvnMrrrZiT+cnIiGesTBqYdELgT27dvHqFGjmD9/PmPHjmXu3Lk0Nzezbds2LrroIiZMmMAll1zC119/DcAf//hHJk6cyLhx45gzZw7Nzc0AXH/99dx6661cfPHF/OIXv+C9995j/PjxjB8/nuLiYhoaGpBScvvtt3P22WdTVFREWUDebNiwgWnTpjF37lxGjRrF1VdfTVJCsFLKk+pvwoQJMh68VXKh3HHWKLnzrFFyx1mj5LbRRbLmpZeklFLWvPSS/OJb35ZffPsybZsZNS+9JHcG9t951ijbcQ5OPBz9w1NyZ+Fo5bsbPUYe/cNT3T0lBzFi586dMY1v+uc/5a5x4+XOwtFy17jxsumf/+zU+b/66isJyA8++EBKKeUNN9wgf/Ob38jzzjtPHjlyREop5UsvvSRvuOEGKaWU1dXV2r533XWXfOKJJ6SUUs6fP19edtll0uv1SimlnDVrlnbMhoYG2dHRIVesWCGnT58uvV6vPHz4sBwyZIisrKyU69evl3369JEHDx6UPp9PTp48WW7cuNFyvlb3C9gqo5CxPcZSyPQdMbxvSuvQAsppBQVkz57NaQ/cbxtkNruUHBfTyYOeyDXV091lySCdHDJkCFOmKHkx11xzDW+//TaffvopM2bMYPz48TzwwAMcOnQIgE8//ZSpU6dSVFTE8uXL2bFjh3ac733vexoL6pQpU7j11lt54oknqKurw+Px8MEHH/D9738ft9tNfn4+F110EeXlyvwnTZrE4MGDcblcjB8/nn379nX6uszoMdTZzb2gX3PwfZ9WxR2UVlDA/muvA68XPB6GvfiCZTVy1swZNG3aZHjv4ORAT+OacqjZo+MgixVmCuusrCzGjBljyYN0/fXXs3r1asaNG8dzzz3Hhg0btM969+6tvb7jjju47LLLeOutt5g8eTLvvvtuWJdQWlqa9trtdiclLtFjLIU3i401Cil+OHzPYr6+9z5FIQB4vRxbuswydtB33jwG3ruY3lOmMPDexU7a6kmGjOJi8n50U48Qjg41e3Ah0P+WWxKmFA8cOKApgL/85S9MnjyZo0ePats6Ojo0i6ChoYHTTjuNjo4Oli9fbnvMvXv3UlRUxC9+8QtKSkr47LPPuPDCCykrK8Pn83H06FHef/99Jk2a1On5R4seYyn8bfC3ubzfKww+Zsw86giYeypad+2ice1aQKldaNq6lcGPPAIoiuFkUAa1ZWU0rHmHrJkzTor5OkgskrFKPhmRaA6ywsJCnn/+eX70ox8xcuRIfvKTn3DJJZdwyy23UF9fj9fr5ac//Sljxozh/vvv59xzz2XYsGEUFRXR0NBgeczHHnuM9evX43a7GT16NN/61rdITU1l8+bNjBs3DiEEv/nNbxg4cGCXMaWKcKbKiYiSkhK5dWvsrfUKl3yX/1q7iwt1xN0CyLp8Fg1vvKltc/fvj++okWnjZLIMasvKtE5yALkLF5DfA5gdHRgRqfvfyYZdu3ZRWFjYbefft28fs2bN4tNPP+22OcQCq/slhNgmpYzYgq7HuI8u3pphUAg16WkMvHcxgx95hKzLZ2nbzQoBTq6gsnmuNc8822ODjT0ZPcld5iCx6DFK4by9ivmmuo4yOhR27tqyMpo2fmAc7DF61U6moHLIXKXskT5lBw4SieHDh580VkJn0WNiCuYmO+m+DoObxYBA4Dn1zDMT2pWtK9B33jzaDx6k5plnQUpEWlqP9Sk7OLUgpezyJvYnIzobEugxSuHs6i+117aPlccTzEQCUgYOPKkUgor8224jq7T0lPIpO+jZSE9P59ixY/Tr189RDGEgpeTYsWOkp6fHfYweoxQmVn0OBHs0q6/1yPrWpYags+qKUbN5XLl98dfUnhRZPU73NwenEgYPHsyhQ4c4ahHzc2BEeno6gwcPjnv/HqMU/t27H33qmkP6gZox8N7FhnROczYPoBWxhVMMTlqoAweJQ0pKCiNGjOjuafQI9Bil0JzaCzBaCmaoVsLQZUuD22wyj8L1d9YrkmgUSCQ4CubUxKmWNurg1ECPyT7SU2freyqYYc5Esss80m83V0AnkidJVTBNmzY5vR5OITjMrQ5OVPQYS0GPcP0Uek+9wPBeXZnbxRSsrIJE8iRZKRjHWjj5YUVF4VgLDk4E9BiloO+8ZtdoJ62oSKO00CMcvYWV0FbdT4lw+ThEfKcmHCoKBycqeoxS0NcpWMUVRGYmfefOifm4ZqHtyu3LgQULyZo5wxCbgKAP2Z2TTevOXQBkXzE77ApRb6kkIqbQHX7sSOfsib71nsbcmkj0xOelK9FjuI9WTSvkrMPKa1UpWLmQouU50gd/Iehe0qe06o+l0Rm3tYHunovUVIY+/1yXPNzdQakc6ZwOzbODWOA8L/HD4T4y4cxAjx1VEdjFFKIJCpuDv6BkLPlrai2PVVtWRuUdi0IUAtBpauNYmqnESqkc6djRnDvSOY8tXYZsbe3RNM9W6OlNcuzg0IInHz3GfbR3AJx12L5wTYX3+HEgfMGaWXHUrVhJ33nzLP3/VnUOeoiUFHwNxzWXUyzuoVhXTbH4sRO1wtefE7ebjspKmisqyCguprasTKMpV6F+DpwQLoLucrc5q2FrOLGY5KPHKIU+9X2B4Erezn3U9skn7L5gKr7qasN2fW8Fs/Bv3bWL5ooKS///gQULjSdQS/RdLjKnTSN1xHBqli7TzgHR1zTEmsESix870rHtVmzmY6vnrF/9GvWrVlH3yivUv/YaQ599JtQq8/upe+UV6latUlx8Xm+3CsXuEs5OZpI9nFhM8tFjlMLAFkUhqIogXCTFrBBUNLzxJocAf00tqaNG0a42vfD5OPLb/8GVlhYSYDYrEOXkytl7jR1L85Ytho/qVqzEV1cf1QMfz6opWvqLSMc2f+7OybYVoBnFxYqg83oNgs7y3vj90NGhfD9SdqtQ7C7h7KyGw8OhcEkueoxSMCNeSi19IBm3G3w+kJKWQPDbvNrXWw9phaOo/dNyw4/dnZMdYnW07tgRnTsoiaumSMc2fx5JgFoJOvVz873B7VYsBZ+vW4Vidwnnk3U17GQFnRroMdlHW8aMJ9PXFjbzCJdLWalGCU9+Pt4jR0KCx72nTAlJR1Vh9cNR4xcdx44FrQ+3m/633KIJ3FjTOfXbIfn+ec3VEhCgVgotltTUzsw5XloQq/mZt0Ur+HqagHTiIMlBIp+jaLOPeoyl4BVuILzbCL+frMtn4a+pxXv8OB0HD9J76gX0LimxTDntc/ksZXVryioKV2BmZfqqgssQkBYirEsG7H+I+u14PF3in49mdRvJ7Dd/Hs884+WdsruX+jlFK/h6ooB04iCJh/l3nHPllRHrmhKBHpOSmu1tBsLzHgFaplHbJ5/gr6uj4Y03abKxTBrXb6DvNVfT/6c/JXfhAlLPOIPUM8+Ma37moGt6YSG+uvqw6Xfhgr3qdjo6FJdMF6TwdVcLSD33VLy8U9GkOkY1pqKC6ieX9Li0SdXVhtvtxEESBMPvuL2dupdf7hKerB5jKRzu1ZfTWmojpqRmzZxBzQsvGrYZ4gg6tO/dS83evQy8dzHunGzav1Qa+agr1VhcF+aga87cOaQVFMQU7FU/N6eBngj++WTBbBno+22DUmEeDaKJH1gF16ufetrgWjIUKLpcJ+09j9VtcbLGQU5kaM+b+jx1UeJFj4kpDL/jr7z+2s/xSL99XEEIsmZdRvPmD20zkKzgGTSItBEjDEI99YwzSDnttBC/dtWjj9LwzrtkzZhO/m23GY5j5QuPlyKiq2MKsSJRvtIDCxYa7nvvKVPCVpZ3dk56qpKqhx42uIiat5Rz9PHHlZWdy0Xv884j7+Yfxxxb6W7E4/460a/pZIDV77+2rIy6FStp3bVLaa9rE6+LBidETEEIcSnwOOAGlkopH7YYcxWwGEVO/0tK+YNkzceLCH/BUtpaBSrSioroOHAAf3198LiVlaSaGoC0f/kl7V9+SdOmTdS88CK5112r9E4O1CSo/82KwQzVp61WuJp/dHZ++kT455OFRPrcrQoG61asNIxRiwsjwXzPrASdOqb6qadDfegmS8JOIXQH1UgsAjvW+EBPjKEkGlaxsLSCAm3h0ZUxhaiUghDCLaX0xXJgIYQbWALMAA4B5UKI16WUO3VjRgKLgClSylohxIBYzhEr0nSXEG9Katsnn+DOzQ3Z3nHokNa1rePwYdr37tU+a9+7l8P3LA7Zr+GddzWlEC5Aeqr96BIZlLQqGGx8f6NhjGdA7I9VpHtul2IbyYUSy7UnYvUdz7MTayquE2TuPKxiYfqYIu3tHH/7bVxZmSeGUgC+EEKsAJ7VC/UImAR8IaX8EkAI8RIwG9Dv/0NgiZSyFkBKeSTKY8eMn39+W0jhWlSKITUV2tsNm6QvVD9mzZiuUWzbUVsIUzPtrBnTtdfh+iZ01Y9OFUKtX+yhdfsnpAwejICEpHbq0dn8f7OZrf41V1Rw8Mc30/7VV8H0Yo+HfgsXxHR8iHzP7RRAxAyrKK89UQuBeJ6dWOMDTrFd52Fl8WoxxdZWAPx1dVF7GDqDaJXCWOA/gKVCCBfwDPCSlPJ4mH1OBw7q3h8CzjWNKQAQQmxCcTEtllL+3XwgIcRNwE0AQ4cOjXLKRkz4KnAs3bZwzXY0mBQCgCcvj3ad+8gzaJDhS1IFaM3zL2jBZ4C8H91E+8GDljGFcH0TuuJHpwmhwAMI0LF/P5CY1E49OhOUtLOomisq2H/tdeD1amMzS0tJHTGc6ieXxKzYogo8x1FZG+7a9crULMyP/PZ/8B49qj030VoR8T476rXVlpVFvH/ma2pYu5bKOxZZxs30OBXiEDG75mzG21HkD332GQ7+5/+Hv65OG6v3MCQDUSkFKWUD8Efgj0KIC4G/AL8LWA/3Sym/sNjNSt6ao9oeYCQwDRgMbBRCnC2lrDPsJOXTwNOgBJqjmbMZaW3BCURiSg2HrMtn0bukxGAJ5P3oppBxeqvB/EVbfaHh+iZ0RWaHJoRsEG3Ht2hXpvFSFViREfrq6umorDQoBID2r77SCPdi5ZXq7D0PJyysrt2sTPMX3RHMIAOtYr5m6TI6qqpofOfdqKyIZChgu/NkFBdT9eijUcXNTgWXaKzXEGm8VTOvjOJicubO0e4lGD0MyUDUMQXgMuAGYDjwW2A5MBV4i8CK34RDwBDd+8FApcWYD6WUHcBXQojPUZREwhO702SUlkEYpJ5xhqEzWzRVs3Zd21RlkVY4CndWHzImTQzb4S1eIRottBWlzlLQI9qOb7G4R+IRVFZkhK07doDHE6QdUSGM33asrUzjvedxZe+YlKmvrl4T5rV//jPeqiptbNPGDywVr909TZQCjub+Nbzzbsh7S6WQJJdoV1ofMQfk47xm9f7ZZS0mGtG6j/YA64FHpJT/0G1fEbAcrFAOjBRCjAD+jeJ+MmcWrQa+DzwnhMhDUS5fkgSI7Gxkfb0hnhCrkmj/8kt2FY5WcoZ79cLVqxdNmzdT9dDDpI4cSfu+fcj2djx5eeTd9EOatm6l4a9vadQZKcMTk8tuAAAgAElEQVSGMejhh2jbvTtkBYbHQ+7182n+aAv+jg5cKSlarUL96tfwVlfjycvDlZVJ47r1IAS5110bkrqqxgPUh0dvqaQVFGjplL66eu2/Pkh65Lf/Q+vOnQiPh/SiItuYgpVSU4WP3cpUv0/tn5ZrCiitqIg+06dHlXart6hEejqN69cr99fnI2fuXLzV1XiPHCHj3Em0f7XPEPDPmjkjYcFb/X0McQPF48e3CVxnFBfjazhuWCn2nnqBYinoxiZj5R1PK9isGdOjWtUmwyXa1dZHrNfgzslWYl0Q8zXn33Zb0pWBiqjqFIQQF0gpPzBtmyKl3GS3T2DMt4HHUOIFz0gpHxRC3AdslVK+LoQQKFbHpYAPeFBK+VK4Y8Zbp7BrVGGIQlBfdylcLkRGBrKxMbrx5tWvCQPvXUxaQUFIPAAgY8oUmvUspB6PRuCnQQhEWppCZb12reEHnbtwgeWDGBJI1x0DrGsiIvWVACUQH0vfBju+JQM9gMtFemGhpmD3z78eOjogJYVhzz9H2+7dMfEkWRao2c0rcP6Bd/+y03US5voW89jqp54O1kgEeLOs3Jqxwo5HKpq5po8tIv0bI2OusYkXyboH4RALF5b23LjdUT8TiUSi6xSeAM4xbftfi20GSCnfQnEv6bf9SvdaArcG/pIKP0aKiy5XBtpE/Mjm5ujHh1EIYEpdM6HZTEtt8rkDSpVkezvNW8pDTP+a554HQn3CIdQRgUrL+tWvUf/aa5YCPBq6CdneTv3q14wEdKZVt/lzK6vEQA8gBOmjR+Orq+fY0mXBxIH2dr6+9z6NgDDamEP96teMXFcW1kBGcTH5i+7g8P0PgNfL4Xvvo/3gQcN9DFcDYQXzSjGkDiVJyQhWLs1IK/L8224jq7SUAzfcSMNf3wqbcJDIlXxXZUGZv7tIyqB5SzkdlZXKMxmoTPbV1dvu090IqxSEEOcB5wP9hRB6wd0HZfV/0sCPMmHVZdRtloIQpI0ZQ9snnyTkcFapa+HOjRChTLAuFxmTJoa4KfB6LYOFIX0QhECkpADYuk3M+6SccQYdX5o8hX4/dStXgt8fFCQmyo76VatCyP1ChI3NPuYYg8ZIG0Akn3lzRQV1q1YZLS0bKgtfXX1QCfv91CxdRuqQIVqmVKLdHF2RjKAiGvdYd9Qu6O+BOydb45xK5Hlj+e5CiCk9npOCbiaSpZAKZAbGZem2HwfmJmtSycDxi4ro+15QEEetDNLSoK0t4jA1ZqHC0IRHD5eLgXcu4uiTS2guL0e43ciWlpBhntNPJ33UqKDP3AR3bi79/+uWYN+Ga642CnQL5C64EXdWH0X4P/e8YoUETFm9cK157nmDVWEOFpp7RKgxBUCxFCxWalbZVYduv13xjavKTAjNvaUKkrwf3aT90DsqK6l75ZWoMpus9sHlUtxx6muTFRbJZ968pTx4X4Qg85vfpNfYsdYZRpMmhlCxq0onWQIz2ckI2nni4InqKiGoXn+yYgsxFR/qLVafj+y5c0kZNKjT6avJRgTWB/ke8J4Q4jkp5f4umlNSkPevg/iIwzKIQiEAuHv3xtvQoLks0kZ+g459+0JX7z4fzVvKGRbot2Dna08bPpx+CxfQtGmTJbHd4CVPGh6UxnXrw87PHB/IKi21fODUMZGChXaZUuFWq+Z9Bj/yiCEuYEfepwq75ooKW6Vjht0++Yvu0ILsVQ89rLiChCD3xhsiuo7Mgq7fwgVhU0Fzb7zBeB8DSqczAjPeXhGQOCETjVWSSMsl1mtOpNINcRXF8N2Zx8ZCUdGdKbthA81CiMeklD8VQryBRSsCKeV3kjk5K8QbaP7ye1fRGnDZdJX7KGPKFFq2b0c2NAQ3ejwMe/EFav78Z5o2foBn4EBLiyJ34QLcWX0MGS5gT2y397JZhkwbA4Sg9/nnx0TOpg9sZpWWcmzpMrxHjpAzd06nA2TmH3ks5H3hBJvdcQBDBpf644xHSMbadCeeQG24+6ZfQOiJ/qIhTjwZ6wLCXbMdmisqODD/+uBC4K47o25xG3Ici+BwLN9dvIr463sWU/fyy4qrUghyrrqK0+5dHPX+Vog20BxJKUyQUm4TQlxk9XnAkuhSxKsUPhlViJtuDDADuN3k3nA9HVVVYYn3PMOG4fv662BWzfPPRRTmEbN7dBlCVlkydoLCqlI42h9mNFlI0TKYhjuHOyeb1p27grEDU2Oh/EV3cPjBX2tBZpGaanlPo5m/eUxXClorRtihy5ZGNY/uyMxJBOyuORyaKyqCWWZuN8LliqvJVPVTT3P0sceCMaTAgi7p9Q/q/HXJI9E8s5GQkOyjgEJwAz+UUl4T92xOAMTVTciC96hT8PmoWboM0auXcbvJ9+w7elTLJlIzckIE6/0PGAKyKhGcWsEbgoCf/tjSZVS3tuLK7Uvr9k+0TBo1A8kqYGjOWoomIGsnpOIpiAp7DlPXO0BpLKS75oY17ygCQr0VURDR2XW0C5cZlexgqjlYL9LTtTmFy9CCUG5+X0M4hprug/kex1MroT2zUoLPp3CVRdGLwMpVhNsdfP69XirvWES/KFyNnYHVb056vVQ/ucTS2k80IqakSil9Qoj+QohUKWUCJWTXQs0+igmJVAg6hFhnpkCyOWW1LeAWaq6ooH71a9StWKEFSWVbm/agazEIK0HpcoEQ9krD71eKa0zImDRRqW/QPaTRBGSjzUKKeCy7fhHqOczXKQSkpBhiE1kzZ9BUXh60FCL4gpu3lAeVZeD+gkXwsotjA2kFBYbvonH9epo2bTJSYoTJ0NKSEaQ0ZENZ3oNu6EVtpYzD0b/YwZx9plqNaovbaM+dUVzMwLt/qaUWg8IHFk8TrVigzV+XVo3fT9PmzTRv25Z0izTaOoV9wCYhxOtAk7pRSvk/yZhUMuDxeJBeb0gVc2epL+JCpNRRE1q2buXQ7bfT8PaaUEUlpfag64N7TVu2GOoUMi++GO+RI1pcJQQuF766essc7GEvvhA2phBLMC6WH3k4i8O88lWRfvbZ5N+5SNlfNye1MhyIGPDzNRwPHjOwqrZSdPrMqHhjA9HUR+hz3Q0LCAtKjHAZWm27rFNwreIkVvfdKhaUSPeZ3WIiHP2LFcxB7rbduzl83/3g9VL14K9JKyiIOoW277x5pBUUUHnHIo0gUn/v4rrOSCzCptTahjXv0LR5c5dZpNEqhcrAnwtjaurJg4CmNyuARCgEd//++I4eTcCR7GEbgxDCUAijZd1s2WIY5j1yxL6vgBCI1FTcOdmWgbWM4mIyljxpuauVYADInj1b+W8hgM0/8ojWgE2B2NBnn1Esp5UrIWAV5N+5yDDGfF+igVl4tu36jLybf2zd+jSONNBYXGiWue5er5ZWa6bECJehZWWlWX1/VvfdiprF0EO8vT2seyMaiyKRaaz676V+9WtBy9rCHRvp3BnFxfS78QZDLCxaLjAzolWk+vmnFRTQvG1bl6X3RsuSem9SZ9GNSISl4M7KCq8UhAh1c3QWgUI0kZpq+ZBYEcexY0fIXPS8Q3q3CV4vh+9/wHJVpYeVP1tf1Zx9xeywlxGVNWDXozrww8m+YratwAmX6WR3XVbCM5EplrG40Oxy3e14l8LN08pKi6aDXMakiVQ/ucQwr4Y17wQVZWB/O/dGLIIw3D2Ol6baG0Vr3UjnjseNZTmneHixipUKefXc3R5TABBC9Ad+DowBtE4xUspvJmleCYfo3RuamkK3J+DYaWNG4zt+3NDX2ZWXh/B4SB08mOzLZ9H4/kbN/dK0datx5e/x4B4wAF9tLUJK+8pkl0vr0xopzc6WOM7tpldxsYGb3wB9YM3v1x5aWwZOkwAB+6pmK0RjDUSb8mmlEPSr2/aDBxUivgjCyU4AaFlbnayUjUXAxJPrHs56MVtpdkR85vseTlFWP7kkrHsjFkFoN/fO0FTj8QR5vwL3MNb7ZnXvYoE+Uy5Wa6i5okJry9m8bVvEhVpnEa37aDlQBswC/h8wH0iuvyTBcGVk4LNQCp22FFwuS9dOr7POskwXTCso4Khp1eXOyaH/j27i8D2LQ4tBdEgfM4as6dPxNRyPatWg70jWtGmTFpj11dYaMij0Al8LrAUymzImhWfgNAsQsK9qtuT7icNloB5HT8th5Zu36tWsKlx9gD7cvTOfN1E+9GgFTGcslGiC2XbHNwvIcIoy7+Yfh3VvJMItFOsK22xh5eiqiQHLfufJglWvjFjqJro6yy1altRtUsoJQojtUsqxgW3vSSkt6xeSiXjrFD44p5Dc5sgKIJ5AtJ5PSR2bcsYZ+Orq8NfWRuc6MqWlAiFZPyIrS3k4dFXWmaWl9Fu4gLbduxVXQGsr2d+90mAB1JaVhXSBU/fNvHCqtgqRKR4+uXsOo3JHcfqeOnwNx2nb9VmIpdH/lls0d5P+wbaj04bwPwwwFprpX5v3MdQjgOGe9Z4yhbTCURpDZ8Pf/m5NAhhAxpQpWmW5GVYCNdpc/0jU2omAmokG1nGbRNaDRDufeIsOoz2+FSNurOPNz2Hb/yyivP9xSvJLGD9gfNRziTZpAUyFaC4Xvc87L2xqqf75aXx/I627duGtDLSi6UStREKK13QH+1BKOVkI8TYKY2olsEJKeWbMM+sk4lEKRcsKeekRI0sqRCbHi4Zq2+rudXk2kwW9tuf008m76YcA4YvaPB5FyPn9+IF3x7v406wMlrX+BymP6gSmrufxwLt/qSkSdcWsD0RCqBAyCFSXSzueuQ5A/4PNnj3byFuk8hWpz6wpPhJCFR5FLCf1zDMNfSkAQ/cw/bVEI5hC6icCKbLDOll4ZD6HvrjJqrApUtHXydgK00wfHglWFe4dlZWagJZC8Mq0FF6dDKnuVP44848RFUM09z7ceMCSbl0/3rb+JoB4FXy0SiHamq4HhBDZwM+A24ClwH/HPKvugsv6MvU02laC3Ey1bTdG/3m3VExb0Gt7//1vDt+zmJoXXgy/byAPWlWQ0z7xM/xAG43vvBM6DsDrpfH9jSHmrDmj5sjvHqO2rEx7r7oQcLuDCka3P4SayUDoPjqFINLSyF24gN5TpjDw3sV0HDoUen1uN6SmKscRod9O+969HL5nsTbX5ooKap551jBGvTbV1dL/lltsV6oh9RNSQiDjJVFo3lJuWYynhzl4rX+vCp6jjz/OgRtupLmiImFzixXNFRUc/PHNfPW9qwzPixm1ZWVKK9L9+6lZuizsWBUZxcWaJadeb93KlYbvpi7Nhx8/Hf4OtlZFXmxGc+9DxputVdNzbx5vWX+jQzQ09J1BtNlHqtO8Hrg4edNJEixYRu3cQvFs1//HZly3IdxKOZC91HvKFBrWrUVIcPvh7IOCzBkz4F/WrpX2r75SLIxAcVDGpIm4c7INK1N/XZ2hyMece1310MOh6Z0WQVU1s0i/D4AnL48+l88yrBjbDx40EtDNukxr8gJY1m+o0DOYmp8XvUCNFIy0q59IJDImTYSUlLDFeOGC2TH755NkVZgpVA4HamisVsGdqYQ3xBcMtOeCnDY3biFIcaVQkh9xER3VvTePDymkC0OfHVK4ZoF402GjRaR+Cv+LtYcEACnlLQmfURLwyYJd/PN3haTbu5dtEYk4TxDawAchSDv7bGPPBI8n+L+jQ1n56lYcQMQua67cXGRra7Di2eUidfhwY6zAdIzc+dcBUPXob43EfABS0veaq8kqLaVp0yb87e3gEnw3aypnTvgmDQulsmo2PZzu3FzEoUMGRan+QI/87jH8dXXaWP2PNyT32iK4aRf0VPc5tnQZjWvX4q2qCqnKjdTLVl05WsVYDAym6ekxsaeaz2FVPxEpNTcWZBQXM+z55wx+bQgNnuqD2WaCw2gDv4kKrlspllgoVOKhu1BhJ5hdKSlc8b1FnB5DTMHq3oddJFgkYsRSuNb4/kbav/oKv88Hra30uXxW0ju2RSLEmx9uZynl8wmfUQTEG2je/c1SfJWViWdHtfNbm4LEnkGD8PTrR8a5k6h94UXLTmnuvDw8p51m24AnvagId58+Wvofbjc5c+cqjV9MLSbrVqw09Ho2r6JV6EnV6le/FkKRABipNTwecubMCQbOAsdQA2dWAU4rBRANrARJtARp0TCvJpLBNNr56z+LJVgZ6TzhBLc5RpK7cIEtdboZkYLr6j105fbFX1NrmekUjkvKTLaosgNHU3MS6z2KVjBH2r8rYzB2v8tkBpojEeJ1udBPFnyB6H3CXTt2StW0AvJWVuKtrLSnmQB81dX4w1BghOwrhMHFon9gW3fs0Fb4hz/5hNQzrXMCXLl9OXT77RqNt1otq5LnydZWsmbOYOCv7tZ+kMfXvGO47qZ//EMrWjK7Laz6Ioere1BhJ0iiWTGGVAGD5Q/KLi3U7CKKVyCEy7nXBx/rV63qFGtrJHeQuc2q2jQpmmsJl05qxcxrlRpsN7+MYiOFSsa5k8LWkXSmTkD/XdjFUGwr67uJdtwq6NztNBcnYj+FzqBbeI5ihGxsjH6w18uxpcvot3CB5hapfnIJHceOhfojbZSXvsaiva4u2LITNPK8pk2btCylpo8+Cg2cmRgo0woKaN25i9adu2h8f6OhL7K6Oo5I2R2GiwaUmgPPgAEKSZwJBh+yiTE11h9UMgRC/erXDNko8bK2qohUB5A1Y7pl06SoqCfC1EnYBTzNLqBIFBIqhYpldXUSUnntrBa7e9zVdQLaXM1B50Db2+6muVBTVx5N6iy6AN5UD+72UEK8ExK9epE6aBAiIyNiL+fGtWtp2rQpYjtONbZw5JFH8YdTPGoapVmpWNQFaAg8rO6cbCUne+XK4HiLzC+rH5m6PRpSvbSCAtr27KH1009pfO89jaNJRazBvXCIViDEwipat2qVYVtUrK1h5hCpwM0q1hJWCFqQIlpdU0ivbt12PaItwEsk95Ed7O6lFV2LNl998DcM02qiYX6Oc668stOuxmgQsZ9C4H+XN9NJNPz4u6bJTnp6KAtqhAByCFpaaN+7l6zLZ+H9+mt8dXVhi7BkR0eIi0CPjClTDEIzbN0CBBWDHh5PcLs+VjJsGJmTJ5M+ujDY3lJvlQR80fj9hoCr/sfvaziu+JZNdQt2giQSR1OswT07NFdU0FFZGbHhuiZgW1vB5SL3xhtCgtyqoG3Zvt2Ysy4E+XfdGV1GU7ieyCbBbc7pV/+0+dgJxxgsI72r0C6mYFAwgYJHdb5WsCNSjNTxrrasTLMew7ZJtbmXZgFs9uHnL7pDq/SveujhpFNNQGJbmsaCaLmPZgH3A8MC+whASin7JHFuiUXvDGiPwTUTL6xiAmEUQuqoUbhSUkgZPoymjR8YM3d0rp20oiL8x4/jb24OJd9zu0kZPNhA7atH+xdfUFtWRlpBAb66enIXLqBx3foQvibAUMymR+7187UAoBrIbt21C+/Bg9RXVdG2d681Z1Og25y6LygCSd8rWc9XL1tbObZ0GRmBHtSWGRqTTM1PAn2vzatn83sVeoHSsHZtyApaS4F98NfBVdrcubartOYt5cFr9/tDsqLCFiSZWG4Nx9XNMxbhoA8sq/9DMrFshKNBWdgwn+rnpadSad5SbnDnRRvbMY81EylaVcPriyfNVnLje+8x7MUXtOuJNsMtHP04YFtb0xUCu2337i47V7TcR48B3wU+kdGUQJ+AGPrT2/haxy3U3S4kd24uGVPO1wR/6yefhFbk6hDWjeTz2e4H4K2qUqwDNVMqsJpt/mhLiFJIHTqU9n37Qo7RuG49rt69adm+nX4LF5A+ejStn36qNaJp0WeEBUj3WioqQEpq/7Rcy2Syomk2K83GtWupLSsLy9eTe/38oCCQktYv9tjfH4wUHGowEyG0c9csXUZHVRWN77wb8pmqfMKtPs1ZaHq/um1BUhiWW6sVu5r1E4lGw2w11r26yjI911I4mvLkm/7xD5rKyw0JAlZU6ZZ++hhiO+FcZObPGta8Y3xvtpK93hC2XjNfl106qHqNVvxdeiWq0cwnMfjcFdXxVohWKRwEPj1ZFQLAq3tWcV53T0KFx8PgJU/y9S/vNmxu/+KL+I4XrWtK/foCq9mUYcNChqSOGBHCkQQYtjVu2GAUgqbHIn30aDKnTqXln//UVpzqysr8w3fnZBtX/QFEKk5yZxmN1IY33uRgc4ul6yCkqY1NGnHju2vjLzpTKTgCUP3qBheUrg8CHk9YH3FE9446TwvKBHNg2V9ToylZq3iBHqqyqPr1Q0q2m64i28r3bve9muNCkWI7YYPRps+yZs4wEPCZr1etCYo3OGynMPXbuiL4HK46/kRQCj8H3hJCvAdobGwnU+e1Uav+BXS/heDq04ecq75HzZ//THugzaaG9HTrneJBFLw/ZndT1uWzyP3BD2h8772wMYxISihn7hzlheqCCrT6TCsoCFltVT30sHI8EyFgpOKkjEkTQ/ZpXLuWxo0bQ4RtCNWHuuqyallqqHgNvI9QfNa8pdywX2ZpaUhnMjwecr73PdJHFxpW980VFVQ/9XTIqj+ie0en4M3ujKzSUo7/7e94//1vbU4Na94hraDAOB/dfTLXAKSPHh2SAh2i4AJBV6vvVS2kiya2oyoqO/ZQKyFtrn1JHTLEEFMAe7Ze83mtXDJ2ClO/LdlB8a6ojrdCtIR4a4BG4BOUAl6ge5rvxFu8tmNUYURuom53LVkFqaOAKyfHEIuIFyI9XXMH/PuORXhtYhR28OTn0+fyWbiz+lD76quG/VNHjeLM1asMP8T61a8Fi+DcbjKnTdPqIqLJRzcXZQUvROFFUlfPe799maX1Y1YqntNPNwjS1DPOIHv27IjBajuivEiFX+FW/YBlcZtB0ajd16Lwsw+8dzG+uvrgfHT3yWpsWkEBB+Zfr11T/l13BhMJdEkI+vka6EiicKuoweHWXbtCkgwSgXAFgolINY636U+sRXPHli5TWIoDvVQi1bTYISHFazrkSilnxjyLkwzqo95taatxKARQeIa0JiKdWFHItjbqV79GyqBBZE6eTN2BAzEdz3vsGDXPPW9pZXQE4hR6v23dqlXGFfaFU2MqTsq/7TZthdi6a1fw+gNxjso7FtHvxhvInX+ddcaV30+vkhJcaWlkzZxB4/sbadQpBXduLgANa9cq12UjuCL6521Wk3arfs0fHmiLmj660DIgqrcuzO4Mf0MjmaWlhr7atWVlxgSCgH8/pLgt4Lob+vxzRneJqrx035m+X7WqCKNxq1gVviXDDaPGFepfey3m2oNIQlwJ/m7ReniHE/adUUJNGzdq31vmJTNPmEDzu0KImVLKNUmdTRLhB9xEJ/C728UUD9ILCxFpacaAbxzQ6CzcbkRKiuIPjlYxhHE5uXJy+Op7V+EZMIDMC6cqhU/68T5fzKl+zRUV+Orqyb9zEUCQDiAgaDv27+fwPYsZeK/y17DmHfymoHjamWdy2r2LldcFBUHXmdtN6/bttGzbZhSCgfhItO6GcFlDIeRngcJBb3V1xJRbq3tkl1KpZgS17txl2kFY+uQ1HijzecyxH4tiqmhrDawK3xLphqktK+PYM89q9zGkq18khR1BiFvFqfTWqRmRlJCdVVO/+jUDJU7DG29SW1KSVP6jaJXCj4GfCyHagA5OwpTUDg+4vdEJ/JOiwM2E1j17IloakdxMKUOHBuMMPh/pxcWknXmmgecoXvgOH8Z3+DAQqJRWffo6334sK0WrH+1p9y4mfXQhhxffG5IJpPIj1a1YqdVN6GMF6qpw4N2/xFdXb+DdN8DlMgiQSKtJs2A1++5VpeFrOK5ZI40bNxoD17q2qHbntE2pDKSVZs2cYSya83jIvOgiPHl5ZJWWkjpkSFheoYziYkNXPnNMwi59Fqy7nKUVjjIUvqnNohKxCg6xQqyUVwSFHZE6xKzUIlTMh1NCsdKexMIQGw+ipc7OiufgQohLgcdRFulLpZQP24ybC7wCTJRSdm6pa4MUXWw0ktA/2RQCEJXryZObq1BZmKA2mqlbsRI9b6tsa8OVlRm/QvB46DV+vLX1EvChp48ZQ9vnn4dkpUTkRrKpQO2orAyZr0hPD4k/6DvWVf36Ic2vrQo7y+t2u8m86CJtftESldm1D218f6NGUVL91NPB+hCfj8xp0xSrxecDIWjZvl3j7LGjadALYs39pKaVfvSRIZaQedFFWovWulWryLnyyrDdwEApVrMiNwwJqAeURbi51v5puTaXXhMmhFUIsTbXMQvslKFDGfTwQ7bWnWWwf9JExSUbENTmKmbLau4w1c7hlFDzFuseDRnFxaSPLgxJiuhu6uxRUsrPhBDnWH0upfxnmH3dwBJgBnAIKBdCvC6l3GkalwXcAnwU6+RjgUv3+7YT+iejhRALRO/eQfbWAO126ogRhh/kYV3GSc7cOVT/3+8jHNQ6y8mVmUnvi6fRuG699X6BtMz00aPJmTsnJCNHL2Qyp07Fk5eHr7mJ5vKtpA4ejOe0gcHzC6G4vaRUiqRUN0rgPI3r14NpGrK1lZo//zm0v3Z7u2IhuN2h1wk0rltH43vvIVwug2sthBrBSmCaoFKUDH32maAQCrh/+i1cQOaFUzl83/3g8ymZVevW0WvCBMuUULPwzV90B4fvvS8YAwi4BNVVsycvL+i2am+nrqyMupUrQyhDzLByXRnqEQL3r/6118iePTs8pQSAlLRs28aBG260VKpWhXiRGF7NArvfjTdE9vWbgv35i+4IKlGfj6oHf21w4aUVFIQyFXi9HF58L/VvvMmAn91qadlZtW/NmGTs0YDbTUdlJbVlZUp2XuAZUzMXk02dHclSuBW4CfitbpteAnwzzL6TgC+klF8CCCFeAmYDO03j7gd+g9LRLWnwu5QGMuFwUimEWKkzCBTA6TJH2g8coP2rrwz8Qe0HD1L/5l9JHTyYtIICXH37QlVV8LT9+xsrqm2sCH9jY6jABXC5GHjPr2jduYu6lQnWUswAACAASURBVCupC3TQyrp8VrA4yyRkVGI+FS0BN5QGfYDd6yX7e98jZdAggxvFTNvhyu1rPT/1mtR6AlUwqII1cA6rq65buTK0xaj+Wiw6v+ndO+Y+343vbzR+x1IqVpfHY3CJWFUhpwwebPxu3G7NNRZiTejunTl+EQ1CUicDgX6wTtu0HG/jejEHwevf/GtYJlUI32DIDMtgf3s7x5551nDvrQrqLHnAAt/R/muv06qqIwWYM4qDPRq81dU0bdyoPLem2hf/8ePUvvAiWaWlSQ02R2rHuVQIMVBKebGU8mLgOZTU1E+BuRH2PR2l6E3FocA2DUKIYmCIrrNb0tARbePRkwU2XZmiRiCIqQUz77uf3dMupmbpMnyHD2sPtrmgLmPyuZaHE+npZF0+C1dOTtjTZl327eCPVBe0bHjjTfYvWKicIyA0rISo7bVoExG4sjJp3rIFV1am8TgqOZ/HQ8e+0HRbz+mnB1fTHg+5N96gvbds6RqwdrQfr452XOP4Ua/F7dbah6YXFQX38/tp2ryZw/c/oOT+S4n0+bRmQlZILyw0tATVzqE7Xt2qVYiUFG2OqtJXs4RUd0bOVVcZraJA/CJa6GsMek2YYPhOXFmZlu1L9efW2q0GVsdmWmuV0VVF6uDBIQpQ3ae2rIwDCxayf8FCjj3zLGmFoyKuqg33TncPOsyZd243Ldu383WgdWtHZWWoNamH10vzlnLbYr+QeRQXc9q9i+k1dmywyNGqY2SE9p+JQCRL4Q/AdAAhxIXAQ8BPgPHA04RXDOG6VyKEcAG/A66PNEkhxE0oFgtDhw6NNNwSB/Kg4PAp5CKK189vU4WMz6cFgjVYZBM1/PUty8NmzphO49trLN0kCIGrd29SRozAX1NLbVkZjR9+GDKsedMmdp8/hezvXmnsXhaukM4Mn8/gtzdQh+iuXaSlhczRq4tHSPMPUhUaOr987/POQ6SnG4W3Kahp50turqig+sklNP3jH8E2kTr3jhXViAo1xVSFeo7qJ5cEGzD5fGTPnUvKoEERg+Dpowu1AHI42o1wrjGRmkrayJGGfdp2fWbZt0E9ltoLRI3N1L3ySkjqaP5tt9FRVUXTxg/oPfUCcn/wA0OdRtPmzTRv22bJEmzH+2S+B5bPWiAJIv3ss/EMGEDje+8Zv2eXK/yixeOxpMfImDQxfNGcKSCdfvbZxpicKdEhGYikFNxSyprA63nA01LKlcBKIcTHEfY9BAzRvR8MVOreZwFnAxuEcnMHAq8LIb5jDjZLKZ9GUUKUlJTEJQ37H1f+nxIKoatgFS9QWU/1bg2Xi7Y9X9gqhJyrrlIEzz2LaQNLumUVvpoa7cesBiu91dU0l5fjP37ccM5orKXWHTtCp5SSQtqZZxp/bObr9HqpWfaMwa2QefHFSvA3IDzzbv4xx0yCyDNoEJkXXGDYZpeuavB9S6mRDmokgWYEOKvssoPybv4xTeXlWlzCXPRmJ4jsAsgqbHsQmFbBngEDDPvpA6IGokFTcVvKoEGG5k7mTCuVj6rh7TW4M3qTv+gOGta8oynAcCzBakOhcFCvxapPiBrvaly3zviZxbPnysrC07+/IU7XXFFhYH6F8O4k8yICUIoI29sVF+Cv7u72OgW3EMIjpfQCpQRW61HuWw6MFEKMAP4N/AfwA/VDKWU9kKe+F0JsAG5LVvZRbotA2reb7hmIUpBqkBJ69YKWFsPmrG9/i8b1G4INgaSk/bPPQvcP5G5nXzGb6ieXxDTVuldXGXzHISvBKK+j99QLDLEDNdOq/eDByFQgps/6LVxAv4ULNOHWvKWcdl2xGygd9upeeUXL6AlHAW2oG3C5NCbZ6ieXGK6vV0kJmVOn2tJD6Leb4xLqODtBpHbdU1fhmtvLZNFE4jYSKSlacNzsy2+uqNCqo7VnUMpgzUe4dE2LILZISyN/0R0G/iM7luD0sUWWKbFmWNGmAMEYjLlGw+VS/nTb/I2NdHR0cNqDD4QkTKjMr9EUzZkXEfoiwmQrBIgs2P8CvCeEqAZagI0AQohvANZ8vwFIKb1CiJuBt1FSUp+RUu4QQtwHbJVSvt7p2ceCk5fLL3GIJw5hCmaL3r3tA7QmiMxM3BkZNKxdG5KXHgn+2lqt2Y/s6MCd1UcrQOs4fDiUN8oKbje5P/gBvUtKlKrnnTtp//JLJSsn1nvh99O2ezdpBQV0VFZSvWSJdWGfmu2jy8Kx6u6lUZQHIDyeIPOmLhMGj4e0M880ZGbpA5L6dNjmLeXBuERHh0Z7bSeIDt1+u/ZdNrzxZtA1GMj48tXXK0y3qnvL5YroGssoLg6xZAwFWPrnKcCJFS5d0y4o7aurN+xjtejImDKFxnfepeGvb0WsIs4oLib3xhtCiPU0BaW6D91usr79La13BMCxZ57VYhB6unHL+25SgHqeqHBz6wploCJSk50HhRBrgdOANTqWVBdKbCEspJRvAW+Ztv3KZuy0aCYcL6qyYEBD9DGFUyb20FmYhJ6li8hG4cqGBrwNDdQsXUavEhvKFbvVuioUdUFId042GZMmKfn+0SgF0PpMi7S0oECKsEAQ6enB1akOdStW0rZnT/QEZbqsmoa1a6lbsTK4b0eHYag7L4/q//u94dipw4fTfuAAdS+/TN2qVQy8604OP/hrY5MegsFHd062IVuqadMmmsvLyb/rTsuVeNP6Dcb5qvtaZHypMRRzLYM51z+m1azLpfWSsKoZaHx/I94jR+h7zdX4GxqVmhBdPYs+E8hq0eE/fjwmKgs9bYq+WU/1U08bYg0Nf/u7Es8oLyfnyivpd+MNmktMXxeSe/38kI5tegWod6VZseaG425KJqIixDuREC8h3l8uLWTcPkfQdxsyMqC5ObZ93G5Shw2j/cABo+memhoiGEOgZgzFmLYLSnps4zvvhjQNSj3zTIVYL5rfTCAzRaSkkDljutG6CvDiq01nbK0WkzsjvahI62GhP5ZKr9C8pZyjv/tdyGFy5s3TXBd6i2P/1dcYz62ywlpdn8fDsBdfsC3OC+cn1yp2VQptl0sT7vqxtWVlSizFgsMrd+EC/A2Ku1JfRa0/b+aM6TS8+dfgvh6P7bmimXfIuI4OzXo1kwpqcY5//MNw/tzr59vyZhkIE03fJWCocsbjIWfOnE4ph0QT4p30KB8J4/Y5FkC3IVaFAODzWbOb2gS0NdoMlwtPfr6STRQrAi6nlPx8oyvB5QpxWXmGDcMVyBgyKAshyNFl/lTesciwnys7myG//z8AJWPIzq1mEoyeAQOMvm2Xi8yLLzZWA6vFiSaYXRDmtMbUUaPIvGAK9W/+FV9VlWWNg20BWAQ/uZqHH45Cu7miwtCBz4yaZc9oTYk0ahLTedO/MRL3VVcF6UmkJPvKK20zsKLtiWC5ujfVZLTu3KUE+j/6yNDPvG3XZ5oSseJf0ldN6y1LwGhNer3UlZVFpMBIBE617H1bXPaJowpOSFjl/8cId16ekiPvdmtFZlYKIWPKlJDz9SopMW7z+ZT0xFdXGXe2WM179++n/csvQ+MbLhfpowu1mgBzrn3O3DmakM67+cdaUxhLqGmPbjepI4YbhbXfT+P69TToXD2ZF11kvB6XSxOiVY8+yheXXErVo48a6yfS08m8YIpWo6Kdw+Uis7SUYX96kbSCAqqfejqkjgBMtRhhekjrayTUojv1eM1bQjvwGRAoKLStAQmcN/uK2YqrMLAt+4rZ2nlV15R6zkjz1o9X56/yVeVcdVXwe5OS+gCv1MC7f6nVoIjUVKUoMdy9MVlqmmtMrXI234ZAk51kosdYCgMPKw+6VXaGg25EvEV4uliEr7qaFnOvaYvxLdu2KcFEnTkfkpoKwSpo8/nA3nWkxkAAfD4O33sf7QcPkn/bbVpKpBV/T0ZxMcNefIGv770vNIPLpABqnnk2dF6BLnodVVWar9uQPx8IkDesXRvatzng8siaOcOStRQh6DV2LGCfRqkvXlOzqdp279YEl7mpkLpPyPEmTUSkpSkrd5eLrG9dqgS+1crywPdtFeg2C0l9CmjYc4bjI1LHt7ZqqcDq96a3ulSrRAYWEwC9xo9HtrVp9SR2fFFf//Jug2WUPmYM+Xcu0sYMvOtO6lasxFtTY+jzkWz0GKXggu5vouMgLnjy8/HqqDaA6LPJVOURyAxxZ/Vh2IsvGFwZKtWGBgtFlXrWWbTv2RN5Naura6hZuozUIUNIKyjAndXHkpQNFCFz5upVGoNqSEGc+dgWMPjSTahbsRKfvsYDhS7CX1enpIUGir9C3Fh+v9YrIGxr0ECgVIAt1bpITWXo888BGFNcW1s5tnQZQ5Y8aVBSfefNoyo/X3FnHT2q1cfkL7pDO7fqzlF7JtStWqXFafRuJrB3Fdll9jRvKQ/GlHTfpT6zKvuK2Vp3N9zukELLqs8/B7BUioZ4QQDpo0cbxmhBaDX9VcqIXQATgR6jFBQ4NsLJBpGaSq9JE6NOg1XhHjgQ2dhIyogRCucTgN9P/euv42s4rvV4ziguJnXUKOs6C20SgvbPPw+viCzy1gFqnn+BjspKQ71F267PLDl5+s6bp7XxbFy/PlQ52cQLAOPcTAHq1l27SCssNAxPHTyYliNHNLoINeW35vkXgnEcKbXMMeHxhDLZ6msIOjqURZddJlp7O8eWLlOYWU3ZW41r17Lvmmtp+fhj8Hpp+vBDjq95J1iJrrtGX129URmp12qaQwhBoUUtRKTKYvN91FNWqwq87zVX487qE6RaN12zvlJctU7qV78WGhcLFBuqMNxbdQ4eDwPvurPbi9dOHQgfyDBcJVHCbG1Im9d2+5jHo/vMvI/dcU9qiyfKlqPuvDx6jRtH5oVTFabIGKFSdrSZ+gy3793LsUAMQKa4yZt/PS4r363utYhklbjd5MydS9vevaE04UIYVsV6Cg7A0rXQtnu3pbWS9a1Lkc0tNG/Zgr+hwXY6uTfeQPtX+4LWhtdruA8ZU6bQZ+aM4FwD9QJ9582jYc07IcH9lq1bITWVnLlzDS4ZQ5MgiGi9eY8cMZLPmc+hwucLVQhgSQAIBN1LbrfyGwswwpppzUMqhVV3klsw9NE7ybhEq61VLIjzzjPMQ61L2L70t3geVfpzNG7aRL+FC8i+Yja1r66EDkVpC0AKAV4vAvC1t/Hmioc5q3YOqbq+FhKQLoHvv2/gD771rH31l3yz/nSKP60n3y1AgpCB4/n9WgpvMtEzlMLibDoYpF1sZ+wF834izGf67VbKJNx7vQIxKwf98RKLLrCkomw56quupnHjRtr37Qua8W63krsfqUbBXPtgUQshADoU4jnzFfuF7ocY1WR9tO3dqzGD6pF58TRqbHiMtDaiXq+W8glKMZQVorWW3Fl96LdwQbCLnAkCxaWhz9hqWPMOaQUF1n0CAteYMmhQSFZR/qI7NHpvDQFadndurrb6x+0m49xJSu8MtbI5hnThXiUlpJ15pnJe06o/f9EdBvbX5i3ltGzfrlBTmArKVCZeQ9tQv6T64V+R9dUhfCKHjEkTlVabeoVw+Sz6zpvHx0c+5vOVz1BE8Pk4tnQZR5qPsHugn8IABagE/EjNbe0VkpcydjD25V1c5fVp++4d5OL5UhdfpLyIb4ePkYckpX/5Eo8PvC745zfgnC/B7QOkn6+rvgjSQCQJPUMpEF0/hWgQr9gMp0yi3Uc9f7T7x45u71JtRHu7QQEItxt/BHK81FGjlF117qDUs87C39KCd//+qIS8XwZbt0aLlq1blewmHTzDhlH7wou2wq9t376g0PZ6OfLb/6H1009D6iNiQqAKN6O4mPTCQlpNlhIoK960goJgYFdXcDXw7l+Su3ABda+uQrhc+OrqUMn6OiorqXr0UYP7y1dXbxn8bv/yS9i/n9SRI5VYjN9PzbPPBccEKoPDxUIAEILUs85SWqP+859ahbh51W+m5zi6ZIkhvtO0ebNWbJZ9xWxFsbgF0q+MafraQ9Njz2opze5sY7Mcf00tAFurtvLpWVD0VfBXIgH3n99glDrlwDZXYGHhBzYUCfYMFgj8zPW4cPsEfrdg3VhJ4QE/px/106cF+tVLPF7l+cMPXw5y8XWu5IqPpHLQP79B7VkTur/z2qmAE7FEzyx69daB/r/+866Z1QkKtxuvBb+NHu2B4B4ul1KZ3NxsGy+wswTcps+jVZFtu4w9kCPNVZpcQB0HDxorxiNxM5mgutxU5MydY2iaBIrSVHs2Z8+eTevOncGCOK9XaWMZyKISqankXj+f5o+20LprlyEgr1oT7pxs+1W/z2e89/oxPp8iaMNcY3pREW2ff26I56h8SWqaqVbwpvPbW5LbmRoA9b3matLOGIb30B68TS60bziQ0uyrqTHsrrqOSvJL+P2EdAbUtjD7I2NGoz6ZRTstSivg94qUe7pvaBq+x37BwD11VLobmP/YUjze4L4+V/C1S8LxXjD6AIbznBDtOE96LK7H89JZAWMufkQjHCKN0X8ezvUU7rPkruNPAAvBBtJEzGc9SGr/pUXBnJ27zjzGThmE63Mt0tMVRWRFg+F248rOxm8SNnr0mjRRSSsF8HhIPeMMS4UmsrJCFAoEXG5r19K0cSNDn3+OvvPmcfTJJYamSO2ffaZkvgTotXG7Q4V6YOUv29qU9F2LCmMI0n6omUG9iotxZ2fTuGFDeNdQgB48a+YMjdROuQCjCyp99GiF5daUmuvOyaa2rExxv+3YEZxvaytVv36InLlzgt331DiDmhUVKDYLFiZGEWf0eDRFOn7AeP7/9s49SK7qPPC/r7s1I42e6IU0lkACi4dsgYTGPIyJKcAYXDycLBR4vTYQKFyO2d3E+ygIMZv17tZuEpcr5cRZQwBjO44htlO2IBAgNjhZDHrw0nuQMAiNeAgFvUejme4++8c9t+f27XNv3+7p290z/f2qurr73HPP+c49557vPL/zwKcf4NEPP8qLZ+yg729egkKhrIERbtgdvOZCVl1yMisxXHPqNZw9f6V3PNm997G3IPimOjPgaZHA/Rcd7WXv4qPwxv5SeC09jnNiMfZNUvUO+YzlelSlpYyNevMpSiEATFl9DoPPv0DBMfxTMtcRQa6311MI+XzJlEKU5dlsTw/5mInm4JJLcUyil618yeeZ0tfHsZdecu/N8I3huWSeP7+s0p520UXM/dLtFedhh+laupSej3nDPjOvvZb8vn2eIglSLHLkhRe8VU+hZa4f/OjhyN7f0KZNvNffz4l3/2H5KXOB87Sde2N8syj+qXshWYI7kVfOX8nJz/RzeOcuum+5mePbtnP0ueci390PvTjAf7q+8vzrnnM/hvj7L6xbJnT/2W9lye/a70xrWnSMUsiTqE3QVNpk5H5CkJ07l8L+/XXZOqorvgULKNglnT5xE8HZ2bPBZbLDUjh8uPyAF9fcibWZNGnx4sp9G0FvgSWX+b17q6al+9RTmXn1VeUTxtkss2+5mQ++/4NRcwuBirl7xQpyc+eWbZQ7tnEju79yR3ycuRwjAwMceOON0iR3SfmEyO/a5Y3vz5rl5a0ldvkwlKyoBs9DLh0m9PX/4b7JmvIAKq3o2t6Jv4S1cPhQ2Sqy6VdfFbtceOStt8rOoPaXs3afeQaZadPKzwlxPYMQOnzUIPIJzmhuNrq7ugYmT/ZeuqiJ5kKBnvPPdy5lTIOKU+piyPb2cmzjxlEHEaasXs3I+++XXnrXcFCYXG8v+ffe81r1Ydv/InQtXUrX0qVM+62LGFy33jsyMsGOcX+Zafdpp5XMcufmzqVr8eLyU+H8VnQmw3B/f/ly30Ih8vhQX/YTbrhh9Nzs4AmAcfMmxWKZQkiECMc2biyZpyiJeOBgdKPBGIa2bmNkYKBSHhGGtm4b3UwW4vA/PO4dwOSwLBvcODm4bj3HX3vNm7ch5rCpKnNJOnzUILraTCGAe/+BKogIhofJLVgQaeSusH9/0xRCrRTCMovQfeqpjLzzTk3hhE0dyNSpmKNHvT/GMPzGGwzv2uUNxfgn5CU4WGnPf/4vTD7jDObcdqvXmvZbysHKKViZ2kquFmZ85krmful29j/ySLw11jiqVJa53l7y777rDT0F5lZ8xVA4HGqRZzLe8JRtaBz46U/d8yfZLENbtzrNqQNQLJLfu3d0HsMlo+1tOM2JhPGVsEuBiZTmN9KiY5RCKyvcqLjjFIIqiBDFYoWBsPCE3rihWKw0rVEHJYVQcjDlFUk+75n7rrKvI79nD0f27BlVJsFWfJBAy7dWjjzzLF2LF5dZQs3MnDk6dJJk30KVeHNz5pAPKNrgrubsrJkVR3bmFixg7pdur9xnIUL2xBO9JbuHDlE4cMC5tDfI0KZN3mT76tUMbdzobaALPqtMhqGt25DJk+PT6BOlyI3h4M9+nuqu5o5RCs0mapVREgXh+t9qmr80tpLg+GpYntQVQ5yJiTYme8IJyT2PsVKOY/j11yvG6osH7e5cEbKzZ5etkqoH3zpqKZ/8Xc0Rrff8229z8NHHKtNtTE3DgyUKBY69/DIL7vla5WS4yOhEdy5Hbv78eNPuLTznpmOUQrMrsrjdzeORdpW7aa9Okyawq5Ht7a0cjophePfuFKWpkZjWb1WF0NXl5YGfD7lcxVCPb45j2qWXepPgUD5/4WB4YKCmJFSlUODgo49VTIZnZ8wY3QiI7dXUc94HkJk+bcxixoafauhthF8c065E2njr15gxgU+rkcCnKbTLCYXFYmnXdhIKMauUGsGUvj5m33Yr2QULyC5YkEocUy+8kJO/9xAL7vkak1esYNqll5ZWClWQz2OGhpj52Wu9ytMxP1D2d9YsT8H4q6AawNDWrRVuhf37y3ZYS3d33eEPrl1X971J6JiewpGpMPNo+pVIPeGPlzHxdpPRf27tJleaFN57r76hjZQYfvNNCh98ULE8N4quU06hcOgQhWrnX/hksxSPH+edu/+o7FjW4zt3Rk7oHn3++fIT0HxEmHbxxWWb64a3b4dcjmmXXOLZShoL1iifGRmp6tUcP173kORYFEoSOqanMO1odT+topMqtUbSkc+tXXoslsK+fZ6do4SHJeUWLixXCH4LPZsl19vriKDAsQ0bvDgCFeiIY/1+ZtYs70ex6K5ss1lvD0V4KDCfZ9jfN1En06++yjuNDcqP0YxgaMsWwDPlMf3qq5h08smJ4/INA6ZFxyiF0QGkxtJer6iitDeDv/51uYMxTLvkEhCpfYw9dLRq3G5zAPL5yFVEzrPAa+DIk0+V4kiEVVxDmzdz5Ol/Ys7v3hJ/LGuAycvPrO5pDHSMUsiklNS0WqvtMnYfxCVTlIz1yu66L0lYJvQdda+J8FuLvFFxtZp2LDMVOFrjw0FrsbVQpXeS1vOQLsf5GyMj5Ad2OMtX8LviujEUh4Y48Lffp2jyFB0yh//7x56mRccohVbtXau3UNYyVp40jjh/ScJwyZR0lZXzhXD4CS/fdflxuYeX/0YpMAn5NaH7RuN1x+RamtsuFXHD5leyzTUIUzjY2INj/Jzzn0ej82fqvCNUlmg4+Nq6RGU4bDwP4Fj/60ihvEIOpiPo/3i180TGSMcohWGHXbBm0Ixx76RxxPlrhAKKa5kFK6xa92q4rJZGtaaClXxS44JhuSUyhDYzUDhlStnfhrWMm7z8tmYzFmFEmNLX551nEVhBlJayHtzrD/MEyogxZN7PVjQ0wo2QsJIavSaRMofdRupcypqUjll9NDQJplSf/2lb0lyhVEvYY1UscX7ClX7Qb/h3+EVJskEw3OpybS4c9efqQ7jDrO4rJawp8aAM7dJrqYmxKiFjGNqyxTucyFocDeZ1o/OmOOK3pctDl0CpIeTD2F+uhk4QV/kM+yk6TMI3ko7pKZw0r9USjI1WK4R6xtzroVoFV60SDrbG4hSHK/zysKsPxrTLkthgmlstS6swx45VzFek9zyid8m4esS+OnD1EtwNktHfrgaMNGg/RRQd01MYfDcP5Dr6xXHRiB7CWPzG3TeWoZokPZqk8yNJ72817SZPK2mHZ+EqJ3FlOml57PnEhRFXGkPH9BSKx+0Rgy2Wo9U0enihUeE1Uq5xOYQyQam2UqtdV3K1M9meqamG3zFKIa/FDmicUqxnLL3aRDQx12uJo9MVfzsR16syVa4rbvJJd4PXSccoBWm7c9fGN/W8xEnG3+urHEZViVYu7UXShoA22dqHVJWCiFwhIv0islNE7nRc/6qIbBWRjSLyCxE5OS1ZhgJLUrUApk9zn3H7qoJmV3jtVrZrmYhvN9k7ldSUgohkgW8DVwLLgc+JyPKQt5eBPmPMWcBPgD9NS57j07wdk1rwmkOrq+kk672bURaiKsU4WeqRq52XpSaRp9GruBrxDEzoA9FKvhbln8RvuDw0M0/T7CmcC+w0xvzGGDMMPAxcG/RgjHnGGOMvun0BWJSWMDMOeAut2mEJYbNJq0C1W+XjU+vmOO+e6NREVQ7VZIjzFx46qbZCpVp84TmZZuSNS5G54k1nyDB5mPU+i7hVQVHLnQ0GMgXcT8c9F5eksRLMX/+siLRIUyl8CAie8DFg3aK4FXjCdUFEbheRDSKy4f16T2dq1xqsCaSlBNtRuaYx0SyhD1RWwq57gt/VwnYRXtOehOgV9M2h3crEWF9710Y4116CsnJXDBuriH8q5WGZivwLl7WZny1rWzecNJVC4gaPiPw7oA/4M9d1Y8x9xpg+Y0zfvHn17ULbHzisqIP1w7gnaYu5VqTtqrPWtP5rice1+7adaMQmSihX8K68KG8s1KaSw0rFtSs6SL4nl+r5zJCuUhgAFgf+LwIqjHaIyGXA3cA1xpjjaQmzeOmKtIJWmshYKp80KtVmVIa1LNts1LxJPYqh1rHvNJXcWJe7+ukKKwFXj9GdDnfsrqGosPKPk3dy9/SYq40hTaWwHlgmIktFpAu4EVgT9CAiq4B78RTC3hRloWfqHvyRItfVlAAAEnBJREFU43Zs1SiNJ2rct1HhNYK0W//17P+odfgpWP3VorjSfA9rHbOPCiOJYqk1HUnmu6Lu614eXqvTeFJTCsaYPHAH8CSwDfg7Y8wWEfm6iFxjvf0ZMA34sYi8IiJrIoIbM8V9A7TnIIGSFvVM2NYa3lhJY/6j1niaPZza7Hcw3OpvV5I8l3wTjmJN1faRMeZx4PGQ2z2B35elGX+Q1yflmO3Hi/YWOpWJlu/hslxPKzxuojs8sZpEjlrer1G/8XfV+866JmxbXQbG8qyGd++u6m+sdMyO5m+u7nYu/1OU8UzcGHWjw07qt777kq3Q8allT0Bc6HH7WeIXKSePO/w76lklCdUMD7Pr1tsSxV8vHaMU+nYYVQaKUgeNem/GOnxTyxLdRsxbRK02ShpqvYqyWniDa9c2ILRoOkYpnNfvfatiUJTWMNZ3rxFDYhCtXFyKpPoqo+Q0bDn1pHSPkewYpXD6RVcB7T/ZpChKulSbjA/vXq92Xy3xNmIzHceOMfjyy2MMKZqOUQrZowOA9hQUpVWMlwZZo3eFVxv2qnV+BOBf73+gfoGq0DFK4R/3vdRqERSlo+nUBlm1dCd9LsGezND27fULVIWOUQqPnZXFN1M1XlosiqIoTkx6tVjHKIVV7+b1mB1FUWJptwZjlDyTentTi7NjlMIX+7uAxo4VKooysWi3uiFKnu5TT00tzo5RCtMXfAC0X0tAURQlTFQ95btPXn5manF3jFJg6vxWS6AoipKIastmh7ZuSy3ujlEKL+6dATRmrbCiKEqzcNVXg6++mlp8HaMUfnHKUUBtHymKMr5w1Vf5PXtSi69jlIJZOZ0jdne49hQURRnPZGbMSC/s1EJuM+55+S168t5vHUJSFGU84tdbXUuWpBZHxyiFwZHTEGPKDFwpiqKMJ/x66/g2nWgeM+/MPat0KLbualYUZTxTPJ7acfadoxSO/+o5oPHGrhRFUZqOmrkYO8P5wdJv7SUoijKeyfT0pBd2aiG3GU+sHAGSHLWnKIrS3uhEcwPY9tEC914h7FgIBeumikFRlPFIdubM1MLuGKVwdmYKv1yZYcNpGTLovIKiKOOXgzs3pxZ2xyiFq2efTZcxbDlJVx8pijK+Kb63L7WwO0YprOz7Mg/s3c+lg8foX+S56fyCoijjkcy0aemFnVrI7cbiczlt5Te4dE0PZw6UX9IdzoqijAf8emr66R9NLY7OUQrA4JtHMIXyXc3+UJLOLyiK0u749dTIwECsv7HQUUqh59yPIV1dGPtkC0Axwm9waEl7EYoy/pkI77GfhkmLFqUWRy61kNuQnlWrOOm7DzK4bj1vD77G09ue4K0ew23/aGLPbw73IoI9i6hehss9SY+klb2WidBjasc01FJGag2jXnmICK8Zz68Rz6Oe8NutXNSDP7oxtGVLanF0lFIATzH0rFrFXKD/qSIPvf0Uu+cZfu/RIgsOUFquajD4A03hFkZ4DsI43ILurjCC/13KwxVPOP7gfVEvejgel6xxssfF73KPuzfoFiVLNb9QmVbX/dXyzCVDOM5gWqrF68oLl0zBuFxpdIXnuj/sL+q5ur6DYYTDcpUtHG5R5S8se9TzdcUR19AKh+MimL442aPui3Ovlv5mM3L4YGphd9TwUZjrL/8m9/RezlnFHCceNmQCg0WClBWIahV1+CVz3Rv2G+XH9aLHvQhhBRX+FALXwxWROK5FVZ7BTX/hMOIqaFc6q638ihq2c6UVYCQDe2eMDgkWrbzhYUCXDHFhRymHqDz03YvA27PgQM+oPK70VasI/U/4/qh4g+G4Kv9gvFGVaDjcqOfkKieuMhSWrdpzHyvh8FyNuCBxDakoP63szQMc7G7Ek3KTqlIQkStEpF9EdorInY7r3SLyiL2+VkSWpCmPi+sv/yZ3zP8KuWLGKgJ3dvsPylX5B19CF4L3UsdVBElbzMG44yqKN+ZBUazfgGBRCiTcCgtWZL57FvjZecLTK4VCpjKMqIo8TEFg33T45+Xw6lKhiPsZJnnxfD/PniX8+6/k+G9fyPLwJzOsOU/IBq6vWyZ87QtZvvaFLCO5SiVfBHYshHuvyLBumZRdC1fYQ1k40g2FjJeWglTmJcCJh2DGMShkYd0yyGdGn6nrOQcJV+LFzGg8wet+GOuXiVNxucpXWFmEy0QR2D3HU7JhxeH7f2VJeZkOyxSmgFceC46wwvKGFUvcd1wZJuI+Vw8nTnG55IT49MYxlurcl33mYKy3MZHa8JGIZIFvA58CBoD1IrLGGLM14O1WYL8x5sMiciPwJ8ANackURc+5H4NJk2B4uMzd4L34RYFs0fufMaMKwlVJ57Mgxvq392aKnvvRbjjh6Gj4wcLpV4zhgj1aSE1JYQ3MgX/oE65da1hwwP3CH5oG7PMq8oLx5JBAaczYOI9Ngp6R0fiLwEgOvntZhhnHDBdtNiz619Fwl+41bD0pQ8aeTRGWO/xS+vFKIF4DPH2O8LOPZ1k2UOSjuwymGK0Ag7LFtWwBdiwSdiwS/vDhQtnz6M571z776yK5wqgcRbwK9/7LM/xylZezu+cZVr9eIFt0p+tfVsD9V+ZYNmD4yFuGQ1PgtqeKSDANAlL0nj9F+E1vhkfPFz65qcjFmwzZole2nlkhzDoK5+4YzRwTyJ/SMzPwmwVw6juV1xA4ONUrY5Nsd64YSHwGq7xswc0WwAj0fwjmHPKUVzCdf32F9yyWDRj++IcFJKC1iqHrN/9ToSRTuHL28RsUhdC7E2x0+G7Bb/+aRHwHw3FV9OHrroZXVGPMFX/4HYuSM5wGqviPUmZxpNlTEZOSCVYRuQD4Y2PMp+3/uwCMMf874OdJ6+d5EckB7wLzTIxQfX19ZsOGDTXLs+2MMyNXGpXJHfhdrRtZz5OLysxaCkW40CcJL+qeJGlw+XfFGzc0EH4pXS9nFEnT65KnWhhx6a8lLle4tTznJHkfV0ZqLYvhcMIVX/hatetJ4nP1VMJxxz3DpMSVUdf1KMXg6mlFKRZX2K40xjVoann/DfCR7bUdtCMiLxpj+qr5S3Oi+UPA7sD/AeC8KD/GmLyIHATmAA3dw73tjDPrKmDV/DdSWze6leB66ccabzX/9VbMY4kzqZ+xpN/1gtcqTyPKSlwY9YTvUtJJK9JaCQ/HJAm73rhqLQu1KPk45ZG0xxEMvx4lkjZpKoU4pViLH0TkduB2gJNOOqmhAilKEiZq2Zmo6UqLWhRzVG866n8aDYl6SFMpDACLA/8XAW9H+Bmww0czgQ/CARlj7gPuA2/4qF6B0hkoUxRFaS5JhsLrJU2lsB5YJiJLgT3AjcC/DflZA9wEPA9cB/wybj6hXs7cvi3xnIKiKEo7UwRW1DifUAupKQU7R3AH8CTe4oMHjTFbROTrwAZjzBrgAeAHIrITr4dwY1rynJniQ1QURZkopLqj2RjzOPB4yO2ewO8h4Po0ZVAURVGS09E7mhVFUZRyVCkoiqIoJVQpKIqiKCVUKSiKoiglVCkoiqIoJVKzfZQWIvI+sKvO2+fSYBMabUonpLMT0gidkU5NY3M42Rgzr5qncacUxoKIbEhiEGq80wnp7IQ0QmekU9PYXujwkaIoilJClYKiKIpSotOUwn2tFqBJdEI6OyGN0Bnp1DS2ER01p6AoiqLE02k9BUVRFCWGjlEKInKFiPSLyE4RubPV8rgQkcUi8oyIbBORLSLyH637bBF5WkR22O8TrLuIyLdsmjaKyDmBsG6y/neIyE0B99Uissne8y0Rkbg4UkxrVkReFpHH7P+lIrLWxv+IiHRZ9277f6e9viQQxl3WvV9EPh1wd+Z1VBwppW+WiPxERLbb/LxggubjH9iyullEfiQikydCXorIgyKyV0Q2B9xaln9xcTQcY8yE/+CZ7n4dOAXoAl4FlrdaLoecC4Fz7O/pwGvAcuBPgTut+53An9jfnwGewDuk6XxgrXWfDfzGfp9gf59gr60DLrD3PAFcad2dcaSY1q8Cfws8Zv//HXCj/f0d4Mv29+8B37G/bwQesb+X23zsBpba/M3G5XVUHCml73vAbfZ3FzBrouUj3nG6bwBTAs/35omQl8BvAecAmwNuLcu/qDhSyde0Am6nj334Twb+3wXc1Wq5Esj9c+BTQD+w0LotBPrt73uBzwX899vrnwPuDbjfa90WAtsD7iV/UXGklK5FwC+AS4DHbEHfB+TC+YV3HscF9nfO+pNwHvr+ovI6Lo4U0jcDr7KUkPtEy0f/jPXZNm8eAz49UfISWEK5UmhZ/kXFkUa+dsrwkV94fQasW9tiu9argLXAicaYdwDs93zrLSpdce4DDndi4kiDPwf+K6OnCs4BDhhj8g65Smmx1w9a/7WmPS6ORnMK8D7wXfGGyO4XkalMsHw0xuwBvgG8BbyDlzcvMrHyMkgr869pdVinKAXXGdhtu+xKRKYBPwV+3xhzKM6rw83U4d40ROQqYK8x5sWgs8OrqXKtndOewxt6+L/GmFXAUbyhgCjaOS2R2PHua/GGfHqBqcCVDq/jOS+T0Az5m5bmTlEKA8DiwP9FwNstkiUWEZmEpxB+aIz5e+v8nogstNcXAnute1S64twXOdzj4mg0FwLXiMibwMN4Q0h/DswSEf8kwKBcpbTY6zPxjm6tNe37YuJoNAPAgDFmrf3/EzwlMZHyEeAy4A1jzPvGmBHg74GPM7HyMkgr869pdVinKIX1wDK7YqELb5JrTYtlqsCuQHgA2GaM+Wbg0hrAX7lwE95cg+/+Rbsy4XzgoO1yPglcLiIn2Nbc5Xhjru8Ah0XkfBvXF0NhueJoKMaYu4wxi4wxS/Dy4ZfGmM8DzwDXRaTRl+s6699Y9xvtipalwDK8yTtnXtt7ouJodBrfBXaLyOnW6VJgKxMoHy1vAeeLSI+Vw0/nhMnLEK3Mv6g4Gk8aExXt+MGbvX8NbzXD3a2WJ0LGT+B1CTcCr9jPZ/DGUH8B7LDfs61/Ab5t07QJ6AuE9bvATvu5JeDeB2y29/wloxsYnXGknN6LGV19dApeRbAT+DHQbd0n2/877fVTAvffbdPRj129EZfXUXGklLaVwAablz/DW30y4fIR+O/AdivLD/BWEI37vAR+hDdPMoLXSr+1lfkXF0ejP7qjWVEURSnRKcNHiqIoSgJUKSiKoiglVCkoiqIoJVQpKIqiKCVUKSiKoiglVCkoEwIRuVs8a50bReQVETmvxvtvFpHeGu9ZErSiWS+NCkdRGkGuuhdFaW9E5ALgKjwLs8dFZC6eVc2k92fxrHtupk13uitKs9CegjIRWAjsM8YcBzDG7DPGvA0gIpdao3SbxLOR323d3xSRe0Tk/+FZqewDfmh7GVOsvftficiLIvJkwPTAahF5VUSeB77iEkY8+/6fCfx/SET+je0R/IuIvGQ/H3fce7OI/GXg/2MicrH9fbmIPG/v/bG1kYWI/B8R2Wp7Sd9oxANVOhdVCspE4ClgsYi8JiJ/JSKfBBCRycBDwA3GmBV4PeMvB+4bMsZ8whjzN3i7jz9vjFkJ5IG/AK4zxqwGHgT+l73nu8B/MMZcECPPw8ANVoYuPPMPj+PZsfmUMeYce/1bSRNoez9/BFxm798AfFVEZgO/DXzEGHMW8D+ThqkoLlQpKOMeY8wRYDVwO57J6kdE5GbgdDyDba9Zr9/DOzzF55GIIE8HPgo8LSKv4FXGi0RkJjDLGPMr6+8HEfc/AVxieyVXAv9sjDkGTAL+WkQ24ZlmWF5DMs+3/p+zMt0EnAwcAoaA+0Xkd4DBGsJUlAp0TkGZEBhjCsCzwLO20r0Jz3ZUHEcj3AXYEu4NiMgsEpgrNsYMicizeAfO3IBnRwfgD4D3gLPxGmRDjtvzlDfWJgdketoY87kKYUXOxeuN3AjcgWd5VlHqQnsKyrhHRE4XkWUBp5XALjxDbUtE5MPW/QvAr8L3Ww7jHYEKnlG2eXYCGxGZJCIfMcYcAA6KyCesv8/HiPUwcAtwEZ61TPBMRb9jjClaWbKO+94EVopIRkQWA+da9xeAC/20WMukp9l5hZnGmMeB37dpV5S60Z6CMhGYBvyFbcnn8SxS3m5b7LcAPxbP9v56vPN8XTwEfEdEjuEd73gd8C07ZJTDO/NhC15F/6CIDDJa2bt4Cvg+nqnnYev2V8BPReR6PNPPrp7Kc3hHeW7CWw31EoAx5n07JPYjf7Icb1jrMPBzO38ieL0RRakbtZKqKIqilNDhI0VRFKWEKgVFURSlhCoFRVEUpYQqBUVRFKWEKgVFURSlhCoFRVEUpYQqBUVRFKWEKgVFURSlxP8HzkrySKQKCC0AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "for similarity_heuristic in similarity_heuristic_list:\n",
    "    W_sparse = similarity_dict[similarity_heuristic]\n",
    "    \n",
    "    # Sort similarities according to cosine\n",
    "    similarity_values = np.array(W_sparse[W_cosine.nonzero()]).ravel()\n",
    "    \n",
    "    pyplot.plot(similarity_values[cosine_sorted_coordinates], \n",
    "                label=similarity_heuristic,\n",
    "                marker=\".\",\n",
    "                linestyle =\"\")\n",
    "    \n",
    "    \n",
    "pyplot.ylabel('Similarity')\n",
    "pyplot.xlabel('Sorted values')\n",
    "pyplot.legend()\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "for similarity_heuristic in [\"dice\", \"cosine\"]:\n",
    "    W_sparse = similarity_dict[similarity_heuristic]\n",
    "    \n",
    "    # Sort similarities according to cosine\n",
    "    similarity_values = np.array(W_sparse[W_cosine.nonzero()]).ravel()\n",
    "    \n",
    "    pyplot.plot(similarity_values[cosine_sorted_coordinates],\n",
    "                label=similarity_heuristic,\n",
    "                marker=\".\",\n",
    "                linestyle =\"\")\n",
    "    \n",
    "    \n",
    "pyplot.ylabel('Similarity')\n",
    "pyplot.xlabel('Sorted values')\n",
    "pyplot.legend()\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "for similarity_heuristic in [\"jaccard\", \"cosine\"]:\n",
    "    W_sparse = similarity_dict[similarity_heuristic]\n",
    "    \n",
    "    # Sort similarities according to cosine\n",
    "    similarity_values = np.array(W_sparse[W_cosine.nonzero()]).ravel()\n",
    "    \n",
    "    pyplot.plot(similarity_values[cosine_sorted_coordinates], \n",
    "                label=similarity_heuristic,\n",
    "                marker=\".\",\n",
    "                linestyle =\"\")\n",
    "    \n",
    "    \n",
    "pyplot.ylabel('Similarity')\n",
    "pyplot.xlabel('Sorted values')\n",
    "pyplot.legend()\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEKCAYAAAD9xUlFAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzsvXl8VdW9//1Z52QOSQhJIIEQIIIREiTKXBWkTsXSOtRWxevws4reeuvLx97e+rSWHz/a2j691/uj/V2ex+Jwbb2AOHKtVatYBqEQIQqSMIaQhJA5ZCLjGdbzxz5rZ++11x7OyTkZOOv9erWSc/bZ0zl7fdf6Dp8voZRCIpFIJBIAcI30CUgkEolk9CCNgkQikUhUpFGQSCQSiYo0ChKJRCJRkUZBIpFIJCrSKEgkEolERRoFiUQikahIoyCRSCQSFWkUJBKJRKISM9InECyZmZl0+vTpI30aEolEMqYoLS1toZRm2W035ozC9OnTcejQoZE+DYlEIhlTEEKqnWwn3UcSiUQiUZFGQSKRSCQq0ihIJBKJRGXMxRQkEkn04fF4UFtbi76+vpE+lVFPQkICcnNzERsbG9LnpVGQSCSjntraWqSkpGD69OkghIz06YxaKKVobW1FbW0tZsyYEdI+IuY+IoS8QghpIoSUmbxPCCG/J4RUEEK+IoRcHalzkUgkY5u+vj5kZGRIg2ADIQQZGRlDWlFFcqXwKoD/APAnk/dXApgV+N9iAP9f4L8RwftsGlwuwO8H5uJ1HP/lykgdSiKRRABpEJwx1PsUsZUCpXQPgAsWm9wG4E9U4QCA8YSQnEici/fZNLjdACGA2w0cxT2Y/eyHkTiURCKRjGlGMvtoCoBzmr9rA68ZIISsIYQcIoQcam5uDvpALhfbz+DfvV5/0PuRSCSSS52RNAqiNQ4VbUgp3UQpXUApXZCVZVul7YjEGJmNK5FIRg6v1zvSpyBkJEfGWgBTNX/nAqiLxIFc3FUSAvw99aeROJREIhkllFa3YePOCpRWtw15X1VVVbjiiivw4IMP4sorr8Rdd92Fnp4elJaWYvny5Zg/fz5uueUW1NfXAwBefPFFLFy4EPPmzcN3vvMd9PT0AAAeeughPP3001ixYgV+8pOfYPfu3SguLkZxcTGuuuoqdHV1gVKKH//4xygqKsLcuXOxbds2AMCuXbtw/fXX46677sIVV1yB++67D5QK59FDYiSNwnsAHghkIS0B0EEprY/0QZkLKfViZaQPJZFIRojS6jbc99IBPP/xSdz30oGwGIaTJ09izZo1+Oqrr5CamoqNGzfihz/8Id566y2Ulpbi4Ycfxs9+9jMAwJ133omDBw/iyJEjmD17Nl5++WV1P6dOncKOHTvw/PPP49/+7d+wceNGHD58GJ999hkSExPxzjvv4PDhwzhy5Ah27NiBH//4x6qx+fLLL7FhwwYcO3YMlZWV2Ldv35Cviydi2UeEkK0ArgeQSQipBfA/AcQCAKX0BQAfALgVQAWAHgD/I1LnwqB00CjIPAaJ5NLlQGUrBrx++Cng8fpxoLIV86elD2mfU6dOxTXXXAMA+Id/+Ac899xzKCsrw0033QQA8Pl8yMlRcmXKysrw7LPPor29HRcvXsQtt9yi7ue73/0u3G43AOCaa67B008/jfvuuw933nkncnNzsXfvXtx7771wu92YNGkSli9fjoMHDyI1NRWLFi1Cbm4uAKC4uBhVVVW49tprh3RdPBEzCpTSe23epwCeiNTxdazrAF2XBqJdacmQgkRyybIkPwNxMS54vH7ExriwJD9jyPvkUz1TUlJQWFiI/fv3G7Z96KGHsH37dsybNw+vvvoqdu3apb6XnJys/vuZZ57BN7/5TXzwwQdYsmQJduzYYekSio+PV//tdrsjEpeImqHRBQwuD0gUXbhEEoXMn5aOzY8swdM3F2DzI0uGvEoAgJqaGtUAbN26FUuWLEFzc7P6msfjQXl5OQCgq6sLOTk58Hg82Lx5s+k+z5w5g7lz5+InP/kJFixYgBMnTmDZsmXYtm0bfD4fmpubsWfPHixatGjI5++UqJG58JA4xPgHFMNAAY8rDqEpg0gkkrHA/GnpYTEGjNmzZ+OPf/wjHnvsMcyaNQs//OEPccstt+DJJ59ER0cHvF4vnnrqKRQWFuIXv/gFFi9ejGnTpmHu3Lno6uoS7nPDhg3YuXMn3G435syZg5UrVyIuLg779+/HvHnzQAjBb3/7W2RnZ+PEiRNhuxYrSCSi15FkwYIFNJQmOy//bi0evvA79e9fkDWYufKHWL04L5ynJ5FIIsDx48cxe/bsETt+VVUVVq1ahbIyoWrPqEN0vwghpZTSBXafjZqVwurOV3V//8C7GQvevV55TxoGiUQiARBFrvVEXwdABrOPJri6AQAflkU8C1YikYxxpk+fPmZWCUMlaowCEtJZOAEAcMGvZACsLIqI3JJEIpGMSaLHKMxScolJ4P9OpC7Gc3fMla4jiUQi0RA1MQVUfKL+kwC4ln4JSIMgkUgkOqJnpdDbZv23RCKRSKLIKGAwnjC2knAlEslY59ChQ3jyySdH+jQcETXuIz+gyFwEos1+WdUskUiGiQULFmDBAtsSgVFB1IyLfEsd2WJHIrnEOfc58Nnzyn/DwJ/+9CdceeWVmDdvHu6//35UV1fjhhtuwJVXXokbbrgBNTU1AIA333wTRUVFmDdvHpYtWwZAkb1etWoVAGDdunV4+OGHcf311yM/Px+///3v1WP813/9FxYtWoTi4mI89thj8Pl8YTn3YIialYJLl5DK/pZIJJck5z4H/vhtwDcAuOOAB98DpoauH1ReXo5f/epX2LdvHzIzM3HhwgU8+OCDeOCBB/Dggw/ilVdewZNPPont27dj/fr1+Otf/4opU6agvb1duL8TJ05g586d6OrqQkFBAf7xH/8RFRUV2LZtG/bt24fY2Fj84Ac/wObNm/HAAw+EfN6hEDUrBVfaVIAEzAIJ/C2RSC5Nqj5TDAL1Kf+t+mxIu/vb3/6Gu+66C5mZmQCACRMmYP/+/Vi9ejUA4P7778fevXsBKHLYDz30EF588UXTmf43v/lNxMfHIzMzExMnTkRjYyM+/fRTlJaWYuHChSguLsann36Kysrh7/sSNSsFdNTo1wYdNSN1JhKJJNJMv05ZIbCVwvTrhrQ7SqlBOpuHvf/CCy+gpKQEf/nLX1BcXIzDhw8bthVJYFNK8eCDD+LXv/71kM51qETNSkEikUQRUxcpLqOv/2zIriMAuOGGG/DGG2+gtbUVAHDhwgV87Wtfw+uvvw4A2Lx5s9rs5syZM1i8eDHWr1+PzMxMnDt3zvEx3nrrLTQ1NanHqK6uHtJ5h0L0rBQkEkl0MXXRkI0Bo7CwED/72c+wfPlyuN1uXHXVVfj973+Phx9+GP/6r/+KrKws/Od//icA4Mc//jFOnz4NSiluuOEGzJs3D7t377Y9xpw5c/DLX/4SN998M/x+P2JjY7Fx40ZMmzYtLNfglKiRzsbbjwJH31BDzWdzvon8x7aE9dwkEklkGGnp7LHGUKSzo8d9VP4uWJkCKDDl/EfYUiLjChKJRKIleoyC36MrZXbDJ2WzJRKJhCNqjIKfq1ZzQcpmSyRjibHm6h4phnqfosYoiJCy2RLJ2CAhIQGtra3SMNhAKUVraysSEhJC3kfUZB+p8QTN31tKaqRhkEjGALm5uaitrUVzc/NIn8qoJyEhAbm5uSF/PmqMAl92QgD89N2jeGXfWTx8zQxpHCSSUUxsbCxmzJgx0qcRFUS1+wgAKpou4qfvHpWZSBKJRIIoMgout1v3t4+7dJmJJJFIJFFkFEB9iiBeIE5FuHQkmYkkkUgkURRTYJCAYXAFzOH4pFj8yy1XyJiCRCKRIIpWCn5A2Iczzj0yfRVKq9uwcWcFSqtlr2iJRDJ6iJqVgh+AG4PuI+Y9auoawE/fPQogfHULpdVtOFDZiiX5GZg/LV34/n0vHcCA14+4GBc2P7JEuJ1EIpEMNxFdKRBCvkEIOUkIqSCEPCN4P48QspMQ8iUh5CtCyK2ROhd2oUwS3cVdebgCzWzAf/7jk7jvpQPClcCBylYMeP3wU8Dj9eNAZWtYji2RSCRDJWJGgRDiBrARwEoAcwDcSwiZw232LIA3KKVXAbgHwP8bqfOxI1yBZicD/pL8DMTFuOAmQGyMC0vyM8JybIlEIhkqkXQfLQJQQSmtBABCyOsAbgNwTLMNBZAa+HcagLoIno8eFzAzKxkgJKzFa2zA93j9pgP+/Gnp2PzIEksXk0QikYwEkTQKUwBoWw7VAljMbbMOwMeEkB8CSAZwYwTPR48fePja/LBnHTkd8OdPS5fGQCKRjDoiGVMQpfXw+T/3AniVUpoL4FYArxFCDOdECFlDCDlECDkUqvaJS3BGkSpYmz8tHU+smCkHfYlEMuaIpFGoBTBV83cujO6h7wN4AwAopfsBJADI5HdEKd1EKV1AKV2QlZUVthPMSI4L274kEonkUiCSRuEggFmEkBmEkDgogeT3uG1qANwAAISQ2VCMwrDJILZ2DwzXoSQSiWRMEDGjQCn1AvgnAH8FcBxKllE5IWQ9IeTbgc1+BOBRQsgRAFsBPESHUTB9ZVEOtpTU4P6XS6QgnkQikQAgY61pxYIFC+ihQ4eC/px/XRoIHZS5oBS4c+JfcLi2Q91mYkocnrqxQEpeSCSSSw5CSCmldIHddlEjcyFCaxCAwepmuWqQSCTRSlQbBTOkjPalh9SakkicETXaR2YU56YZVgxm1c1bSmrwYVk9VhblSBfTGEJqTUkkzolqo/DcHXOxenEetpTU4JW9lZbVzVtKalThvM9OtwAIn4CeJLKIpEekUZBIxESvUXANDuoF2Sm44+pcywpk3qX0YVm9NApjBCfSI5cadkq9EokZ0WsU/MrsvyA7Bfds2g+PjyLWTfD6mqXCh2hlUY66QmB/S8YG0aY1Jd1lkqEQvUYBwE/fPYo5OSnw+JS0XI+P4g+7z+D6gomG2AH7r4wpjE2iSWtKusskQyFqjIILABWoMdVc6NH9XV7XgY+PNQJQYgefn23FhnuuAqAYhrFgDGRAPLqJRneZJHxEjVEw48bZk7D98KAkk8fn172//XAdFs3IGDODKx8Qr2ntxjO3zh7hs5IMJ9HmLpOEl6ipUzD0aHYp2Ucb7rkKtxdPVl9u6jLqIY2lugX+XDd9Vilz86MQqdQrCZWoMQoGAguCLSU12HVKr8EXw92VsRRU5s+VUsh2nxKJxDFR7T5ibhYeb8BgzJw4Lqxd2YaD1YvzUNPajU2fVYJSID5W+pQlEolzotoo8MS4CLz+QR9TTlrCmDIIjGdunY2bCrOlT1kikQSNNAoaVl2Zows6M1cMy+bJSI5Da/fAmMjqiaYUTIlEEj6kUeB47o65unRObTYPw4nMhUwLlUgkYxFpFDSwVcJr31+svmaWeWQlcxFunSRpYC5NpBSFZDQijQIHn4nEy1toX2fwg3Y4dZKkEN+liZSikIxWpFHguP7yLN3fWnkLUUxBNGiHUydJCvFdmkgpCsloRRoFDcW5aaqkhRYreQvRoM3cT+Fw+UghvksTKUUhGa1IoxAgJd6N7y0MfvDmB+2M5Djc/3IJVhbl6GITwKAPOT0pDmV1HSAA7rw613KGGG4hvpHwY9sdMxp961KKInSi8fcynBBKqf1Wo4gFCxbQQ4cOBf05/7o0EAoQolT5UgrkD2wxbMca79ihjSMAg+4lbUqrdl/Mh9zv8evUNuJiXNj66PD4k0fCj213TOlblwSD/L2EDiGklFK6wG676JG58NtvAjjTOWJxhM9Ot6jxhNe+vxit3XrdJLavLSU1+NEbhw0GARj0J4dKML2HRX7soezbybHtjvmH3WfQ53F+TtGC7CktJtjfsCR4osd95AIMI7KArl4PAOuCNd5wbDtYg9WL84T+f1Gdg5bYGBe6ej2qyykY91Cws6Zg/NjhmuFrj+l2EdS196K0ug3zp6VjS0mNKlMOACBQ3wcwKlwEI+Vuk7NhMTIWE3mixyg45HBtBxb86hO0cGqp2t4K/OB/rL4TpdVtQv///S+X6PbDWjq4CHDD7EnIz0zGC3sq1WMAzlNOg81gCcaPbbdvsxkbv292zLe/qMVbpbXY+nkN3v6iFpsfWWIwrn4KbP28Bm8eOgcQAq9vZAfFkRqcZWaSOTIWE3mixyj4MTgi28AbBAaLF7R2D2BOTgqO1XcBALw+it98eBwJsW5DgFlU58AWLPOmjjcsf7cdrEFbz4CjH3wosyan8hd2++bfT0+KMx1A509Lx4HKVnh9+oHOcG+o8jUpnfAoKEZ2UBypwVnOhq2REi6RJXqMQpjQBpLdLsDnVwb5g1WKy4Of7WtXD4U5qXh1f5XuYU9PijOsOo6e73A0M43krMlu3/z7dgOoaKBj7/P3xu0iACHw+UZ2UBypwXmszoZlVtClgTQKGlxEcWE4JWtcPBo7+w2hCr7ATFvnwKuXagfG1ov96urDyiXjBO0DGuo+7GZk/PtWA6jZQGd2b0I9ZyB0WRB+UBOds9OBb6gD5FibDcs4SGQYCUMbPUbBQaDZT4HbiyejtXsAXb0eVF3owfWXZ2HRjAxhyuntxVPw6v4qQ1aRVYGZ6GFnA5c2IO1yEUuXDGD+IGpfjwnMuiPtn3cyuw3WyIRynqHKgpjdS+05OR34onGAlHGQ8MM/x99dMNW2rikcyJRUDpZpdLi2A+09Hmw/XIfPz4rT3nacaMJDS6fjn28pwOPL8jEzKxkzJ44L6fT4oOucnFS09QxYpt9ZBXvV130UnmFK4RupFpBbSmpw/8sl6gpBi9NWqk5SHZ1sU1rdhg07TkVd2iRztbkJZBwkTGh/bwM+ii0lNbjvpQMRT1OWKwWOlUU5eGXfWd1r2tWBloqmi6houojn7piL9KQ4VDR3Axic8QfjuuCDrncvzENBdkpQwV72Pp8GOhr885GCXxlo+20DSoW5E5zED0TB9Y07K3SuJW2BomsMD5DBui3GahxkNMN+b+z3NFyJF1FT0Yx1aaA2Fc0EwG3Fk7H3TItpBpKIKeMTkJ81Tjeoz8xKRs74RINf+zcfHMdH5Q34RmE2nrl1tm4/Il94qBIR4YgpRJJw+Urvf7lEd9+vm5VpWVk+1HPSSpWsf79c5yI6UNmK5z8+CT9V5iDXzMrEUzdebtjXaA/IhuL+Gu3XNBYQPf9bSmqw7WANjtV3wu+niB2CO9JpRXNEVwqEkG8A+B0AN4CXKKW/EWzzPQDroBjCI5TS1ZE8JysozFcFjOLcNJxt7UZHr1d97Xx7Hy7L0ruNKpq7UdHcjc9Ot+CVfWfx8DUzUNPardYksP/yhoGH+bRZhSv/0Jn56cPhn48U4fS5iwoGtx2s0W3Digvt4O+ZaKBj22zcWWFwEfErCTODMBJSI8EM2MHGB6IxhhJuRLGwguwUdeIR4yK4Z1HesMQUHBkFQoibUuoLZseEEDeAjQBuAlAL4CAh5D1K6THNNrMA/N8ArqGUthFCJgZzjKFACFARsxozvUb9IysO13ZggsAlUXOhR+3aVt/Rh4qmi+p7FU0X8dN3jxo+91F5g2oUrAKkl9pDF86gpKhgcOfJJgAd6jYTUxOC3q/dPTdLsbVzoQRz7eGYfYfy2wk2FVcGmYeOKBamjSkO+Cj+crQeKfExo8MoAKgghLwF4D+1g7oNiwBUUEorAYAQ8jqA2wBoP/8ogI2U0jYAoJQ2Odx30Ghr15gLyeUgzB7nJhjw6V1sPr8xav2Nwmw1vdJM2iIx1mX4DMOqb8JwPXRsEDrd2IXD59qRNyEJFBhyaifPUPP/+WU2+19pdRse/dMhnG2+qKYXx7iAx5dfFtT+Aft7bmYA7DKsnF57uCYCofx2go0PyGK7oSNa8bKYYp9HGW/aezyOPQxDwalRuBLAPQBeIoS4ALwC4HVKaafFZ6YAOKf5uxbAYm6bywGAELIPiotpHaX0I35HhJA1ANYAQF5eaNLR/sABWFzBKbxBAICslAR09A6uBKaMT9B9SWwAfWVvpRp8BoAnVsxCTWu3MKZg1TdhOB46NgixHyAAVLX2AAhPaqeWoQQlzVZUpdVtuPsPf4dXY69vnqPIiGzYcSpow+bknodSS2B17Vpjyg/mv/nwOJq7+tXfjdNVRKi/HXZtW0pqbO8ff02flDfgR28cFsbNtFwKcYhgr8FsezOJ/M2PLMH3/3gQ7T0edVuthyESODIKlNIuAC8CeJEQsgzAVgD/O7B6+AWltELwMdHQy4+wMQBmAbgeQC6AzwghRZTSdu74mwBsApRAs5Nz5rliYAtOxawOyiCIuL14MhbNyNCtBJ5YMcuwnXbVwH/Roi/Uqm/CcGR2sEHIDKcd35zOTEMtzhKJEbb1DKCuvRf86Vc2X1QF94LVlRrqPbcaLETXzhvTtasK1cEcGKyYf2FPJRo6+/BReYOjVUQkDLDZceZPS8dvPjjuKG52KbhEg70Gu+1FzbzmT0vHPQumqvcS0HsYIoHjmAKAbwL4HwCmA3gewGYA1wH4AIEZP0ctgKmav3MB8FHcWgAHKKUeAGcJISehGImDzi/BGRbjnWNmZiXrOrM5qZo169rGjEVhTipSEmOxJD/DssNbpCtc2YxSu1LQ4rTjWzDukVAGKpEY4dHzHYhxEVV2RIWbAQTbyjTUex7KgMcb07aeAXUwf21/FRo6+9Vtd51qFhpes3saLgPs5P59VN5g+FtkFCLlEh3O1Uew1xDqNbP7Z5a1GG6cuo9OA9gJ4F8ppX/XvP5WYOUg4iCAWYSQGQDOQ3E/8ZlF2wHcC+BVQkgmFONSiQgwPjEGCCpUbqSiuRsznvkLKICkWBcSYt3Yd7oF698vxxWTUnCm+SIGfBRZ4+LwgxWz8PnZVrx3uE6tm5uekYTnv1eMkw1dhhlYrJvg+9fMwP7ADycuxqXWKrz9RS1auvqRlRKPlPgY7DjeCBCCh6+ZYUhdZfEA9uPRrlQKslPUdMq2ngH1v9og6W8+PI7y8x2IcbtQPHW8aUxBZNTY4GM2M9V+5tX9VaoBKs5Nw02F2Y7SbrUrqsRYN3Ycb4SfAj4/xd2L8tDc1Y+mzj4szc/AmZZuXcB/ZVFO2IK32vvI7yuUh98scD1/Wjq6ej26meL1l2fho/IG3baRmHmH0gr2G4XZjma1kXCJDvfqI9hrSE+Kg4sQADToa37m1tkRNwYMp0bhAUrpXu0LhJBrKKX7KKVPij5AKfUSQv4JwF+huPNfoZSWE0LWAzhEKX0v8N7NhJBjUIbsH1NKI1L+2d7rBZzVMVnCfFc9Hj96AoNan8ePw7WD2S617X3CQHNVaw+++8LfkRznNrzn8VHdwwQAR2qPGme/GtgxCrJTDPGAF/ZU4lh9J/YEHurPTrcg1k3g9VGdD48AiI9VHqBPyhtUNwU8fszJSRX+EHm3gnYfgLgmQuSKYByu7cDh2g4kxDqT8tAGlvecblYfyu8E0vX08gBA4eQ01cDeu2k/PD6KWDfB1jVLcbKhKyidJFGBGj8AscFiwOMHIYpciR1WxlQ0U+SNmyhFdqgDopVL08y4as+1eOp4pCTGqv0znF5vqAx3FlQw11Ba3Yb175fD56dwuwjWriocte4yp0bh9wCu5l77P4LXdFBKP4DiXtK+tlbzbwrg6cD/ogI/Bbr7nS9ZzAwCQ5u6xrOHG3w9gqA5BTAQeID4pf9Le5XKbt4w8G4FVmn59he1eOeLWuFMzYncxIBH2Yf2IeMfdP590UOp/QwBUDglDW09A/jD7jNq4sCAj+LZd4/ieIMiQOg05vDOF7U6rSvRADR/WjrWrirE2v8ug9dP8ez2o6hp7dbdR6saCBH8TJHfNlLJCCKXpt2M/JlbZ+Omwmzc99IBvHekzjLhIJwD43BlQYmEE+22rWvvxYA3UJlMKdp6nBfHDjeWRoEQshTA1wBkEUK0A3cqlNm/JEgIAa6ckqZbWQwFUeqa6bED/+O3chGCJfkZBjeF10+FwULerUCgyDkQwHSmxn9mVlYyTmsysxA4rzcPnYPPT9WBhJfseKu01iDuxz+UZp/hcwyYQWDY+cxLq9vw5qFzupWWmZRFW88AvAHJXT9VVm55GcnqCifcbo7hSEZgOJmRj0TtgvYepCfFqZpT4TxuMN8dL2gX43aNCbkZu5VCHIBxge1SNK93ArgrUicVCW4vnqyvkHBIvJugXzDD5hmfGKO4qAJom/BocRHg598qxO92nMKByla4XQS9gsE8d3wC5kxOU33mPBOS4/DPNxeog9hDS6cb3E88jy3LR0piLLp6PXhp71l1Kbv+tiLd4PrS3rPqgAYYg4V8jwgWUwCAt7+oFc7URK6Ip17/Eh+VN6jGjACqe4sNJE+smKk+6HXtvdj6eY2jzCbRZ1wA3C4Cv5/C5SLwcTfWzmd+oLJVvS8EwI1zJqF46njhILwkP8Mgxc6MTqQGzEgnIzBC0Ykazl4UACIWWwjmu9Nuq8S8pmLK+MQhp69GGkujQCndDWA3IeRVSmn1MJ1TRNh1qjmkzzkxCACQHB+Dzj6v6rK4fFIKKlu6DbN3n1/5sfwp0J3NrNBtRtY4PLb8MtVnzgvbvfjAAt0PZcfxRsM+tDy+LF83sPN9HRhsG7tgoVmmlNVslf/MhnuuUmdTVuJ9bLArrW4zNTo8Zp9Zu6pQDbKvf78c/R4/CAHWXJdv6zriB7rHl19mmQq65rp83X1kRmcoA2aovSKA8A0yTlYl4Vy5BHvN4TS6/D0L5rvjt/1OEBIVI5myaymIRwjZQCl9ihDyZwg0Riml347kyYkIVRDv9v/Yi3eavglCrEXxwsmyWZn4sqYNXZoYQqyb4PU1S/Ha/irsOtWMyWkJwhXF44FZvTbDBTAXtrvx33frMm20EADXBinOphXuu6kwGy/sPoOmzj7cvdA8bdYp/EMejHif1cBmth8AugyuOzUB6WAHLf4zdvswG9BCOTY/gdAK/TkRThyLdQFW12xGaXUb7n3xgDoYr/tWoeMWt/x+WFIBW1Hzv1e7/YVqiH/27lFsKakBhfL83rs4D8/dMdfx50U4FcSzMwrzKaWlhJAu4dwwAAAgAElEQVTlovcDK4lhJVSjMP2Zv6AybvWwGgUet4vg0WtnoKGzz1J4b9qEJNR39qk/6q2PGh9g/sdmtuJgaDOE2L6cDBSiSmGnD6ZdFpLTfdkdIz0pDmV1HWrsgG8stHZVIda9V6YGmeNM7qmT8+e3Gc6BVqQI+9r3Fzs6j407K1QFVzcBnr65AE+smBmxcw0XZtdsRWl1m5pl5nYBLpcrpCZTG3dW4N/+elKdDce4CLY9tjTixpSdv1ZNwclv1o6wqKQGDIIbwKOU0n8I+WzGKE7jCU7xBQK3ibH6GD3ve26+2K9mEw14/Xjni1rDwLr2v8vgp1SXprnrZJNawcvD/PQv7D6DPo8PGclxOHyuXc2kGTBZZit+dP2+nARkzQapUAqirI7Bd70DWJbVYGziw7J6XeaVEyE6s452VplRkQ6m8sH6xFi3ek5WGVqAUZu/q9djcpSRhb/HodRKsNgPheKu9fn9jnoRiFxFbhdR40heP8WP3jiMNcsuG/Jq2cn5a/F6/diw45RwtR9ubFNSKaU+QkgWISSOUjp686giQDgNghZ+dcYHknsG9CmrpxoV9xLzj287eE4NkvZ7Bn/oLAYhGigDk2d8YmI0/BTCfPol+RmIcekrwp0EZJ1mIdnty2zGzo7BXyeB4qLTxiZWFuWgpLJVnXnZ+YIPVLaq95DdX8AYvBzu2EBBdoruu9hxvBF7TjfrJDGsMrRYMgLlsqFEDFcvan5fopoUwJl6AIPPPgMh8Hqta0bMJgLrbytSU4sBpdYolCZawaCtc2FCnn4A+ypacLDqQsRXpE7rFKoA7COEvAdAzSOklP57JE4qEsQIFFFDlc8eKn1Bam4crGrDU69/iQ+O1hsE+igGB3NtcK+kslVXp3Dj7Elo7OzDEZNUWBeUNEpRDva2x75mGVMIJhgXzENuteLgZ76MK3PTsPZbhQD0sQlWGU4AW036rl6Puk82qxYZOm1mVKixASf1Edpcd+0EQiSJYZWhVV6v169kqzRRnER030WxoHC6z8wmE1byLyL4IPfJhi78PDCwr/tzOQqyUxyn0K5erBQ9/uiNw6pApPbehYKdIeVTaz8sq8e+ipZhW5E6NQp1gf+5oE9NHTPw43Aw8tl2TEyJQ1MQndpCwSwGQQBdIQwbyNnsltHY2RfoK2A0CgRAXKzSXlIUWJs/LR0vPiB2RYoGBkAZeM0GYP4ht1sNmBWIbX5kCd7+ohZvHjoHr0+RDlj7rULdNvx9cQI/eJbXd+KpGy8XGrpQ0kCDcaGJct29XmUGqa2RcJKhJVqlib4/0X0XSbPo9P491u4NJyuKcKaxar+Xd76oVVfWInes3bHnT0vHmmWX6WJhTrXAeJwaUu35F2Sn4GDVhWFL73Wqkvq/InoWw4TfD7jdwctn25GaEGtpFBS1k/BCSGAwN/mRmAnH8eei1R3Suk28foq1/10mnFVpEfmztVXNd16da3kdTlYDZg8De3C+c3Wu6YBjlelkdl2iwTOcKZbBuNDMct3NdJeszlO0SnPSQW5JfgY27DilO68Py+pVQ8ncHGbujWAGQqt7HKpMdXNXv+510bNod+xQ3FgiQolDzZ+mVMizY494TAEACCFZAP4FQCEAtY0VpfTrETqvsJMc58bMgS2odA1dPpunaEoa2ns9aLk4aBiyxsXB7SLIm5CE26/Kxc6TTar75fOzrbqZf4yLIDs1Hq3dA6CAaWWyK7C6cZJmZyYc5ybA1dPSddr8WrSBNT+l6o/W7IHkBxCrqmYRTlYDTlM+RQZBO7utae3Gq/urbAcnswGAbTvUStlgBphQct2tVi/8Ks1MiI+/71aGcsOOU5bujWAGQrNzH4pMtbLCIvAFNK++YzJRsVv1BevG4s+HuYOCXQ0x3aQBrx8Hqy7YTtSGilP30WYA2wCsAvA4gAcBhFYNNkIkx7vRPTBEmVQBLohdO1fkpArTBQuyU7Bhx0ndtuOTYvGDFbMsU0oBYO6UNNxcmI2uXo+jWQMvHDfg8YNSoK3Ho8ug0A74LLDGMpuW5FsrcPIDCGBe1SwyLKG4DNh+tLIcIt8836v59UPnVIOrDdBb3Tv+uOHyoTsdYIayQnESzDbbPz9AWhnKp2683NK9EQ63ULAzbOMKK0+tJgYg7HceKUS9MoKpmxjuLDfLOgV1IyW/dT4h5CtK6ZWB13ZTSoX1C5Ek1DqFBb/8BC0XB4atVmFWVjJauwfQ1uNx5Dri01IBGLJ+UuLdGPD6dVlRN8+ZhMeWX4aTDV3YuPM0ej1+fG9+rm4FsKWkxtAFjn32+oKJ6ixEGxNgg255fadhpfH0zQWqu0n7wzaT0wasHwx2PNG/+c9o6xEA/T27blYmCnNSVYXO97+qs+yjsWxWplpZziMaUJ3m+ttJa4cDFjswi9uEsx7E6fmEWnTodP+s8j02iJUCv304DLvdvefRFqK5AFxjUkiq3T/7/ew82YRjdR04394HQBkTtj32tZDuYVjqFDSwpOZ6Qsg3oQSdrZ3Fowyta2c44MXe7BDpG/EDWpdAXfXjY4349HgjtElJL+ypxPtf1eEHgY5wZiuQj4814m8nmuCnFH6qzJ7f/qIWz90xFycbuvCvfx1c0bgCLjeXi6gBae2DxQcin7tjrqkLYcDjN9RZPLFipuGB/c7VuYbP+PyD0t+8F5BgUJ6jqrVH2PpPy57TLbjx33fr+lIA0HUP065AnMx4+foJliK7dU34ip744qY3S2sNhU12wexw6+rYuV5CCcjzn39o6XS1yt6JC41fwW7cWYG69t7B2hyb1aIIJ/ee314romiXWmpVfwMoY8LJhq5R4T76JSEkDcCPoEhmpwL4vyJ2VpKgEJVTsJ4OMyeOs/ys30/VGAsF8FZpLb5zda5hUGFGy+Oj2HWyybCc5bOdfvvXEwAG3Q7aAZUQohoi7XKYXyZTwPAZrUGIj3XhoaXTUV7fiZVFOdi054zh+twEaq4626eWiqaLurzz0uo2bPpMLyzIBlQnrhy+foJCkel+W5DxEioHKltti/GsgtmjSfKitLrNkYTKlpIaXZtPqxoLhjYji12vi0A3QDvpdaHFyb3nt+cL0Zyoy1p5F4aSDusEp9lH7wf+2QFgRcTORhJ+rGRMoKSiLpuVhU+ONSoVoD7lx8oPKloqmy8ixkUCMgKK7HZ6Upxu+/Yej26w5XOv179fbphxi4KqLLNI+xkAyEqJx+3FU3RusprWbp0A3W3FkzFrUorOLcXXbzC0Cqb8qk07oNrNeM3qJ8KZ27AkPwOxbmJZjGcVzA7WRx0ptU5eQuVIrXlR2FAq4bXXq30cXARB9zVwcu/57flCOiv5bL5wTUSo6bBOseun8H9gkU1p1nVtNJIY6xJKVIcDPs2TAJiXq++ZoBTPEcS6CAZ8yoyFPx03Ec/6GROSYtHn8akd31wA8rOSdbECvlPbw9fmAwB+/cExg/uJQpHcvqkwW6fGWtfeiyX5GXh8WT42fVZpGCTTk+NQ09ar7CGwzGAP6G//egLtPYMSCtqHl8+9FgU3zYKe7DMv7D6DT441oqGz3zBjtOtlO39aOp5YMVMYY9EqmCbEuoJST+WPIaqfsEvNDYb509Kxdc1SnV8bMAZPtcFsXuDQaeA3XKsKkWEJRkIlFLkLRrADsxWie2/nNuPdWMEUru082YSzzRfh8VH0e324vXhKRFcJgL0g3oNWH6aU/jHsZ2RDqIHma3/zKWrb+8IeaGb74YnRpHYCwJTxCcgcF4+l+Rl45e9Vwk5pmePikDs+0bQBz7zcNKQmxqrpf24C3L0oD28dOmdoMbntYI2u1zM/i2ZoRdXe/qLWIJEAICCtUQOfXzFudy/MUwNnbB8scCYKcIoMgBNEA4lTgTQnyqvhVDB1ev7a94IJVtodx2rg1sZIAEWB10w6nccuuM7uYUZyHFq7B4SZTlZaUrzYIlMHdlJzEuw9cjow231+OF1tZs/liAWaR2LQjxS1geg9z1ClLsxsKu9HPN/eh/Pt5jITgBIM7/eYp83ynyUEOheL9gd79HyHOsM/UmseW8hIjsNTr3+pynh7fYNuBSaet7IoB0W3zVUfyI/K6nUro72nBwNnvNtC1BfZqu6BYTaQOJkx8jnqWsVU7QNllhbKu4hCHRCscu6DCVbanYOdO4hvs8qaJjm5FqvgukiZV5QabHZ+86fpJVSW5mdY1pEMpU5A+12UVrcJtzG7xyMVgxEFnUdc5mI09lMIJ+GUuggXogwjM7x+4A+7z+Cx5ZepbpENO06h9WK/MZvJxHppayzaezxqy05gUDzvs9MtiHUrncr2n2kxLPkp9D/WguwUlNV1oLyuQwlKa/oiv/1FLQD7zlhWWjSAUoMwKTUBBdlG1RXdZznF1FCyTcI9ILzzRa1OwypU1VaGXVbUNwqzhU2TnBg7q+C6Wd9t3gVkJyHBJFRE1dWRSOU1W7WY3ePhrhNg8EFn1vZ2pGUuXgv8998iehbDQGKMC71ef8SkLsJJYqwLU9KTMC7ObdvL+eNjilKmXTtOFlt47oNjuGhheFgaJe/cYhkXotRZ9mNNT4rDT989ijcCvnRgMJVVu63oIQP0S3qrgaQgOwUnG7vwVW0H/naiSdVoYoTTh+x0QAhGVfTNQ+d0rzlRbbU6B7usKFGsxWoQFIkiiq7JLBmBX705ydoChqeFp9m9FMm1sPPVBn+tlFbDDf87/u6CqUN2NTrBtp9C4L/D3kwn7AQGp5neyEhdMJjx0WIXQObp9fhR0XQRtxdPRm17L9p7PAZ3lBaP129wEWhZNitTN2jaVU5TAIQ7XKybqOmr2subnpGEa2ZmonBymtreUvtRPx3si6wNuGof/q5eD+7+w35d3YLVQGKn0RRscM+M0uo2nG/vtW24zgbYPo+SQLDmunxDkJsNtEfOtetWCQTAOo2InwgngyU/cGsDy8/cOlv9H8NscAxmZaR1FZrFFLQGhhU8svMVYSakaNfxbktJjbp6fMyiTarZveQHYN6Hv3ZVoVpbs/59sdJquHFqTMONU+2jVQB+AWBa4DMEAKWUpkbw3MJKSkIMej2RL2DjDQJgbRBmZ6cgLsaFGZnJ2HWqWZe5o3XtFOcq+ko9A16D+B7TWNJK+2o51diFLSU1KMhOQVvPAB5flo8dxxvR3udBC7ev2IBGDH8V379mhhoAZIHsY/WdqLnQg4YvanG6sUuo2cS6zbHPAsqApO2VrNWr7/MosQzWg1r0ICzJ1zc/8fmpcPbM/83QDiiflDcYZtAs82Pdn5UUWLeb4J5FeaaztAOVreq1+6kxj96qIIlYpEVqzzOYwUEbWGb/5Y2U2eDIFxmKlE+156WVUjlQ2apz5zmN7fDb8kKKomp4bRW+fpXcgZ0nm/D6mqXq9TjNcLOSH1e+W2q5uo0kJxu6hu1YTovXNgC4E8BR6kQXYxTy1I0FtjPk4WRCchyWzcpUB/4jtR1YNitTmEMPwNKN5KPU9HMA0NDZj5++e1RNnWWz2f2VrQajMG1CEioF1dg7jjciOT4GR86147Hll6FoShq+qu1QG9F8XjUYvHO7gPl56SitaQelFK/ur1IzmUQyzT5uFfTJsUZsKamx1Ot55NoZ6kBAAZxuNPa51qKV4GDBTIJBg/3Cnko0dPbho/IGw3vMFWY1++Sz0LR+dbOCJCuVW9GMnWX92Mlo8KvGNw6dE6bnigZHPk9+7+kWlFS26hIERFLpotVFMLEdKxcZ/96HZfW6v/nr9QRiV1q1Xl6vyywdlF2jSL9La0RFVf2Rin9EsjpehFOjcA5A2Vg1CKONWDfBiw8swE/e/kr3+imbgc0Mn3GCLkSt5AzMZqdnJBm2yc8aZ9BIAqB5rQOfnmgEIURXtaulaHIalhdMxKHqNmXGqZlZ8Q9+elKcbtbPsCtOSkmM1f29/XAdegZ8QtcBr5ZqJmX+1/JGU3kBux++C4A2UsP86loXlLYPQoyNj9jOvcPO00VgGJT4wPKFHo9qZEXxAi3MWKz/czmOBIy+tiLbLB4kOtdgYjtWLjL+vZVFOToBPv56Y90kaLVe0T3gDab2teEIPg9HdbwIp0bhXwB8QAjZDUAVJx9Lndf+/ZOTpu8NZwe21IQYrF6Uh9f2V6Gi6aLuvQSud/NQcNLDgekDse1uL56M+5dOx99ONFoKySlGyHzvdy9UBnM2zrNWnwUBV5l2trX+/XL4/BQu6IPbdsVJS/IzDCKCHx9rxK6TTYbB9pV9Z3WfZbMu/gq0Egjq3xSWcsuA8vBqP3fTnEmGzmQxLoJ7F+ehcHKabnZfWt2GjTsrDLN+O/eO1sDz7oybCrPx/ld1ujTsD8vqUZCdojsf7X3iawCKpqTpUqAJjAaOBV1F3ysrpHMS22GGykw9VDRI87UveRnJupgCYK7Wyx9X5JIxM5ja1yIdFB+O6ngRTo3CrwBchNJLYXhC72HGTBBvuNNSO/u8pllCDR3iWgo7xifGop1rxO50Safd7qPyBty/dDq2PfY1PL3tMKoviGMUZmSnKtITbT0DeOOgPsPmtf1V+PCpZbqH+50vanUz3ptmT1LrIpzo2qy5Lt9wLwd8FFtKavD2F7WDs2fBApcdU2tUxifHoXugV/07PzMZd1ydqxNUEw0g/AD+eGBQ0s4mfX6KyeMTDUFYs1k/IA668u4d1n2Nd2fw2Wgri3L08QLNfdJuy7KJ7rw6F2+WDg6qhZPT1HMlAECgBl03P7LEIGEicnux743BgsPH6jvh81NLN4woRmRXw8Aqy0WD6FBTjUMJAgdb78KO8cLuM/j0eKPaSyWc1fEinBqFCZTSmyN6JsPIaE1LDbZ3M6O914NYN4HXRx0bAxFMJXXK+ERcOysTNZqqZSe0dA/gpX1nVR+8lqpWxf2k9dtq1SNBCFYUTAyqOOmZW2erM8Rj9Z3q9bM4x4/eOIw1yy7Dw9fmC+NJfgosmp6O+Fg3VhblYNfJJpxvGzQKE5KV+c8n5Q14ae9ZQ3YUw84/bzabNJv1M384a4taODlNGBDVri54d0Znvxc3zZmkE5rbUlKjM4LMv8/75JnrbuujencJM16UfRj6ftXzp6U7rjUQFb5Fwg3D4gq6SQKcpRrbDeIs+Mt6eFsN9kMxQrtPNavf261F9gqxQ8WpUdhBCLmZUvpxRM9mmIh0WupIMCcnFXExLhysEldrOmXbwXPw+SncLmVWIlIWNUNkDBhpCbG47T/2YlJqAq4vmIgPy+p1cQSfP/hUv9LqNrT1DGDttwoBQJUDYANtVWsPfvruUTx3x1w8d4dSkd3v8emC4jMnpeC5O+YCUOofdp5sCgj9KcH9g1VtuusfMBlArPzzZgMGP+snAAghaOnqt025Fd0js5RKlhFUXsdVxANCnzxz3fHH4WM/omIqp7UGosK3cLphtpTUYNOeM+p95Ad+u/O0G8RFcar4WPPB3s4ImcmeMKPG2H64DotmZIy8SiqAJwD8CyGkH0pvhTGXkpoY60avhYTEWOdUQ5cwHVbL+KRYXcorz7SMwbRWnx+Yn5eGmZNSsDXIFYOIhq5+NHT1A+jAx8caVZ++1rcfzExR9NA+d8dcFE1Ow8/ePao73w/L6lV9pG0Ha+B2KatFbayAzQr/17eL0NYzgLr2Xp2+E8NFiG4AsZtN8gMr77tnRqOr16OuRnadbILLRdSsLG1bVLNjmqVUsrTSlUU5uqK5GDfB1wsmIislHjcVZiMvI9lSV2j+tHRdVz4+JmGWPguI3W6FOam6wjfWLCocs2B+FSIyXnYG224Q542aWVYVw8oIWcmeiJ670SKdbdQScAAh5BsAfgfADeAlSulvTLa7C8CbABZSSoNXu3PAgNfaIAxnsDkS2BkEAMhMjhMahZkTx+Hha2YY2lf2e/1IjY8J2SDEuAmunjpeNzNnUCgZO3Nz03C8ocuQlWI32JpVoNa19xrONzHWbRCF03asW//nctWvzQa7FMF1uwnw9SsmqufnVKjMrH3orpNNqkTJxp0Vah68z0/x9dmTsPNEE3x+CgLgyLl2VbPHTKZBOxC/HXA/sbTS/Wda4Q/EVgiAFQUTlRatXj/ePHQO310w1bIbGKD47UXihnxAnRkLq3N9dX+Vei4Lp6dbGgS+EM8OfsCelpGE579XbLq6EwX7l+RnIMY1KJHNVzGLqrmtqp2tjNCBSvMeDUWT0wxJESMtnX0FpfQEIeRq0fuU0i8sPusGsBHATQBqARwkhLxHKT3GbZcC4EkAJcGefDBYFASPSg2kSDAuPkZt8clkt/OzxukeSKZpDyhZRL//9JTlPs2ynMbFu3Hj7EmqfhIPS8ssmpKGuxfmGTJytIPM9YEZbXe/FwcqW5E3IQmTxyeqxydEcXvRwAyWzcgApVPcjuPGc+j1+PDa/ipDf20WgHVz+hxKcJXgk2ON+NvJJri4pj28NIJowORhEiWbH1miDkKsR8Xjyy/DioKJ+Pn2o/BRZdtPjjdi4bR0YUooP/iuXVWIZ7cfVZSAgYBLkIBAqSyfmBKvCzpvLqnBtoPnDJIhPCLXlVkAW9s5TyQpASjndrBKuUcioyoqxLNTeOUH7DXLzA2OWbB/7apCNRvOR4F1f9a7NguyUwxKBV4/xc/ePYrtX9biJytn634D7HxF7VuX5Ot7NLjdRF2prn+/XP2NsczFSEtn260UngawBsDzmte0Y8DXLT67CEAFpbQSAAghrwO4DcAxbrtfAPgtgH92csKh4uK+wNEabHYK3zfBCYdrO3SZGFWtPTjT3K3TD6pp7cb2w+eRNyEJBdkpSE+KQ0OnmoWMrHFxaNZkcpnZ2ov9PsOACyjfwy9vn4uyug68eegcNpcoq5PbiyerDww/yHzMGRblfAZXHz4KsBIar5/inkVTMWV8os6Nwn/FGclxwvNj1+T3U112EhtYARY7MV75m4fOGbJotNci+plp3TvKD3HwB7nrZJPuN0sp8HlVm5KHH5AN4YPMbH95E5J0SVduF8H624p0fbHf1mR/sXvHxy+cwKdOskA/hThtU7S9meuFD4JvP3zeUkkVsG4wxCMK9g94/Ni05wx8FqKFByqNzZgQuJbPq9pwz6b9alW1XYB5/rTBHg0tXf3YdaoZWz+vgYsQXWFnZ58Xr/y9Cjc5aEc6FOzmxi8RQrIppSsopSsAvAolNbUMwF02n50CpeiNURt4TYUQchWAqZrObhEjLkZ/qTO9W6yako16/EPsF0SJMgiwYObPtx/Fkl/tCFT29uPzqjbcvWk/TjfraymumZkp3F9CrAu3F0/G+KRY4fuMb8+bjNWL80AA3ZJ5++E6PPCyslhkg4ZTW639HgkhSI2PwYHKVqTEx+j2wyb/sW6Csy3GAr0p6YmB2TQQE+PCmuvy1b95YT+2vxjX4ITD4zPKILBrcRMlEPn4snzMy01DrJuotRn7KloUqQ+fX+1+98LuMwZjyJiTk4qnby5QBxh2DO3+3jx0DrGB12ICBmH14jw1S4i5M+5dnKdbFbH4hVO0NQYLpg8OVBRAanwMNj+yRHeuAHTHZveGNXfiZa2Zoisjb0KSwQCyz2wpqcH9L5fggZdLsGnPGRTmpNrOqrX3Tr0HAKpbe3Rm3+0mOHKuHT979yi2lNTgfHsv3G7zX6jHp9xHs2I/nvnT0vHcHXMxb+p4Vb7eL7A6VvsIF3YrhRcA3AgAhJBlAH4N4IcAigFsgrVhEN0xTQYicQH43wAesjtJQsgaKCsW5OWFtnQqmJRiqzg6luIKodoz9jneIPooAoHgQUTZRO8dEc+uv1GYjQ/KGoRuEgIgOd6NmVnj0No9gC0lNdgrkOXYc7oFV//iE3xvfq6aY65VXHWCz091fnutdAi7Zn9gNq87RwLUtQ3GI/zM6gY+xMZN9pwSKAYyMdatG7z5oKaZL7m0ug0bdpzC3tMtgTaReveOyGgx+F7G7BgbdpxSGzD5/BR3B1ZMdkHwoslpagDZSnbDyjUWF+NCwSR96LG8vlPYt4Hti/UCYbGZrZ/XGFJHn7l1Nho6+7DrVDOuvzwL9y+drhwzEC/ZV6H08hCpBJvpPvH3QPRbY0kQV+amYVJqAv52skn3PbuIdRFZrHswIYFfLVnFy/iA9JVT0nQxOZeLCL+fcGJnFNyU0guBf98NYBOl9G0AbxNCDtt8thbAVM3fuQC0I0oKgCIAu4iyXM4G8B4h5Nt8sJlSugmKEcKCBQtCGg9rO3ot34+WuEIwiOIFrAOXdpx2EUWiw8wg3Ls4D0WT03QpfGZc6B5QH2aWGdTS1Y8Dla3o7PPqjmkVJ2J8dd44EYiNceHySSm69F3eSHr9wB8+qxw0JBS4IRD8ZYPnUzdejhd2n9F9bnJ6Iq6/PEv3mlm6qtb3TQE8EhAOVEQCjXUVTLPKLDvoqRsvR0kgaOl2KZlVVhlLDLMAMsMsPZOfBU9MTYDSxl1BGxDV6jXxxW1TxifqmjvxmVZMj+qDo/VIjo/B2lWF+LCsXjWAVirBrKGQFexa+MkHBdR4Fx8bE/32UuLdmJSaoIvTlVa36YoQAWt3Ej+JAIB7X1S2d7sIfnFb0YjXKbgJITGUUi+AGxCYrTv87EEAswghMwCcB3APgNXsTUppBwDVF0EI2QXgnyOVfdTaZaxoHutxhWDhpSTsoBD3tv7WvMnYcbxR7ctAKXCs3qjbxHK3v3N1LjbssA5Y87xx6JzOd8zPBJ0YBAC4/vIsXeyAZVrVtHbbSoHwhuLx5Zfh8eWXqYPbgcpWnG/TV33XtSlxDJbRYyUBra0bcAGqkuyGHad017dwejquL5hoKg+he52LS7DtzAYi1nWPzcKZa4Jf0dhpG7FK7hWBGhStL7+0ug33vngAHq8froCMOoXi/mHnb5auKQpix8cqgWCt/pGZSnDx1PGmlehaRLIpANQYjDtQHKp+X0T5n3YedLHfB097L/6fu+YZEiaY8quTojl+EqEtIoy0QQDsB/HF4iUAACAASURBVPatAHYTQloA9AL4DAAIITOhnRIIoJR6CSH/BOCvUFJSX6GUlhNC1gM4RCl9b8hnHwSih19UxDaWXEjBEkoYglcwTY5zmwZoecbFu5EcH4NPyhsMeel2tPV4QMhglW9KYqxagFbf0WfQjRLhdhHcv3Q6Fs3IwLaDNSir68CZpot49t2jQd8LP1UqWAuyU3C+vRe/+/S0sLCPQjEmIrkNPqtKew4xGqkKbSZMjIvg8kkpuswsbUBSmw6rzHYHi7WY7LXZQPTU61+q3+X2w3Wqa5BlfLX3DKC0pl0dxJmkhpVrbP60dMNKRluApf09+aGkelqla5oFpdt6BnSfEU06ls3KxEflDXjvSJ1tFfH8aUbZFK0LiDkQ3ESZFLHeEQCwac8ZNQahlRsX3XfeAGp1oqzObTiMAcOuyc6vCCGfAsgB8LFGJdUFJbZgCaX0AwAfcK+tNdn2eicnHCq54xNM+zQzpAvJngFBypPZbLur34eufh9e2FOJRdPFP2qz2boyCBG4QdUgZHpSHJbkZ6Cr1+PIKIBStc90fIxLzdayW2QkxLrUh1nLtoM1ONnYZaqkKroGNhh8Ut6A1w+dG6yw5VwVWePi8PtPT+n2nZ+ZjKoLPdhSoqw81n27COveK9M16YHmGOlJcbpsqc9Ot6Dk7AWs+1ahcCbOp+qyz4oyvlgMha9l4HP9RYOb2b1yaXpJiGoGdp5sQlNnHx5aOh2d/V68VVqrq2fRZgKJJh0dvZ6gpCy0sinaZj0bd1aoldyUAu9/VQ8/pSipbMV3F0zFmmWXKS4xri7kkWtnGDq2aQ2g1pUmUs01q3KONLbFa5TSA4LXgvMFjAJmZI0TGoVocyEFi2EACqaFnIYygW8fsBugKWZkJqP6Qo+augoAcRZZHwy2hVmdhBXfKMzGR+UNhqZB3QM+xwbBHZBYjY1x4XRjl251xXTxQYgqp31e8NusbOnWDdTbDtYY7r82sC3KShnw+lFe12GYiZdWt6GHa8vKVGFF1+d2EdPiNjtJiO9cnYu3Dp1T5UNcLnEnuy0lNVj732Xw+fUaXkdqO/D4snzcNV8vEMgf9/biyfjvw3XqZ8vrOy275onOWySsp53dE0LUIkPenfVhWT32nm5RM/pe2nsWj1w7Q61U18q4MGMjqu9ggojaKudth87h7tHQjvNSwqyfbLS5kEaKHkFXNjt8fgh7O/CGChhccRAoK73s1AThQGuH2wXcv3Q6slMTdK4EF4FhdTJtQpI6uJ9puqgORgTA3QsHM39+9IY+JyMtKRYvP7gQALBhxylTtxof05iUmgC3q0P1Y7sIcONsvTxEjKA3BYXRBXGgslW3TJudnYLll2dh++HzaOzs16djBlJazQYjOz85y8O3ktAurW7TdeDj+cNnlWpTIhaw5Y87a1KKKvxHAVA/xV0WGVhOeyKIZvd8TUZZXQeeuvFy7D/Tql6Dn1KU13caOraxY/BV09qVJaCfgHkDBYZaCYxIETVG4Q1OwsEM6UIaXpxmEVmRNS4OMzKTUVrTBp9fMSYig7BsVib2BjJWGAunKzNO9prPrxR1fXRUL5UgOkettLh27eJyERRNTlNnnLzg3D0Lpg4Gem+8HPvPtJj2r2DjtttFkJ+ZjE+5c9pxvBH5mcnq/lZcMRGfHm9Uz9dFBrO4tHIRNxVm61xKyy/PMqR0ao0O4Fw6XJQyaVYJzd47UGnswKeFrWCsAt3aojz2mlUGlhNRPD5eAijVzNoUVgrgrVKlglurDxUnaAjEH0N7xXzMRlvlzBjw+vHOKGmyM+axqlEQuZDkamF4CNUgaGMRzRcHdFXWZtt/XnUBa67L18lg86mpAPD65zWG82KDvtnpUgSCkUQJpj67/ShqWrvxzK2z1ZRIkX7P/Gnp2PbY1/Dsu0dxvKHLsE+G30+xaU+lIUDOuug1dPapvm7CvX+yoQuflDcY5CKYy2NlUY5QtZQAmDd1PADzNEpt8VpZnVIxf7KhS/WF802F2Gf4/S3Jz0B8rOJ/d7kIVl2Zg/cO1yk9IwAQFwGlVBjo5nsmiPpQmLm4zALcbPs+j19NBWbfGzMQBFBXJT6fInMCAFfnjUe/16/Wk5jpRf3k7a90q4G5U9Kw9luF6jbrvl2EbQdr0NI9oJN0H+IcypaoMQpW8C4kuVoYXWSnxuukNgDnDwb7LllmSEpiLLY9pndlaOMVgNhQXZGdglNNF61ns4CuruGFPZXIy0hGQXYKUhJjhaJsgDLIfPjUMlVBlS+IU/dtcZ1aXzrPtoM16OCaMG0/fB7tgUAsK/7i3Vh+CrVXgFVrUBYoBacHpSUuxoWtjyq+cm2Ka59Hqd5+8YEFOiO1enEeslMTsP3weTRfHIA/oN20dlWhemzmzmHZTW8eOqfEaXx+nZsJMHcVmWX2HKhsVWNK2u9SG2+4M1B4x+TK+ULL4w3lACA0itp4AaNwSppuGxaEZumvTroAhoOoMQp2OelytTA6YRW2TtNgGdkp8bg44MXMrHHqKtEP4N0vz6Or16P2eJ4/LR2zs1MMs3QtBMCJhi7L348obx0AXtlbidr2Xl29RXl9p1CThwU5S6vbsEPjAmIwMUMROjcE9OnHx+o7UZijV7nPm5CEJk0PbZby+8reSjWOQwE1c0wUsNUNtAE9KLN7NOD14w+7z2DP6WZDsP6TY4343gt/x5fn2uHxUfz9TCs+KqtXK9HVa6QUbT0DOmPk0gR+tefACxSKXEV2lcW8a1MrWc0M+ENLpyMlMVYVsOOvWetKYquTd76oNRgEt8bNx99bdg4xLoJ13x754rVLBrfFAwXI1cJwkRjjciTznTUuDlflKUVb698vV1+3M+4MJtnBuw0rmi6qAeO4GBce/tp0g+QFj93x3C7gnoV5ON3YZZQJJ0Q/K+baXopcCycbuoSrlVVXTkb3gA8HKlvQ1WcuBb9mWT4qW7rV1YbHR3X3YdmsTHyjKEc9Vz9V6gVWL87Dh2X1huD+51VtiHMT3LMoz7Q1qJP71NjZpxOf44/B8PmpwSAAEAoAglK4AvIg7sBqxeczNhrStgxlRs2usvjamZm682B1CXyDnceX5SvtSw+d0w32roC+GKAPIGv7WgAwVCpre2FrV17MKEaaqDEKToYTuVqIPE4MAqDECXadbEJlS7e6jHcTJbXYrkaB/6bNvvkBr1/YL9up4WH4/MDpxi70c9dGANx4xUS82Cw+320Ha1Bep2QTxbiAbY99DYBSDCXC6WopJTEWjy2/DH870SicCFEoLg1txtaHZfUoyE4xzdJjPab5gXPtqkJV3pvhIkqNxYTkOHxxrh1eH4WbAEvzM3C8oStQ2Rycyu+i6emYFdBW4mf9a1cV6tRfD1S24si5dnxyrNFQUMaUeHXpoBqlWrafkw1dOoNwe/Fknfqqlj8EfkPzpo437Xzodg8aNG2G1bxcfRyBd8ndNGcSdp1qVo1DV695k6xwETVGwSzVTYvZasHtBiogDcNwM+CjOgPgdg/2STBjdqD1pNYddEV2CnoGfLpsoXDzeVUbls3SK8hOy0jCK3+vgllpx9nmi+qg7fUDv/nwOI6e7zDURwQDq8KdPy0dhZPTcESQYLGyKAcF2SlqYFdbcLX+tiI8viwfbxw6B7eLoL3Xo/rz69p78ZsPjuvcX209A4ZVjZ8qqcTulm5cPkmJxfj9FC9+VqlG7N2E4FvFOZaxEEDZ/IpsRczyUKCYSzTr5+U5frfj1KC4IRThPFZsdufVuYZWqJ+dblHbaroIkMY1y2ntHpyh84aTudl4tOKJd80fXGFpDdrdC/NwoLIVJxu61I5/zFh5/RTzpo5HfmYyXtij6HCJYhvhJmqMglP41YJ0I40e3AS2A/uJgDFwQalM7vH4LeMFIkLN7iir69T9LdLi0dLJFY+du9CjExUMdsXCXG6Muxfm6ZomAcCcnBS1Z/OdV+ei/HwHvqrtUAuufvruUVURNi7Ghe9fMwP7K1txrL5TF5Bng2J6UpyhVwnDR/XGWduGwuenaO0eUJ8vEfMCXfm08Ryml8QkwFnBm9Zvz8/GARgKxB5aOh0Fk1LQerFfV9RKA+d5oVvvptGK+7G+I3/YU2n7/Wj1vwBxzQObBBAorkh26sytxxclRrodpxzqOGZ6t8AXeFb1Ov2KG0kycvDCfCLYuONHaAVzdlj1i0iMdSEhVtwHwu0CJtj0mlCCm0Tp/uUmuCJb3AU3Jd4tfL354gA+PtaIe188gNLqNqxenIeJKfoZ77H6Lty7aT/u3rQfW0sU95WLaxbBgpv9Hj9e2nsWX9V2CCvZtx1UOoMx5dxF09Nx85xJhq51PKwKe2VRzmA/Be4jLgIUTUlTtZzUc4MyUG4pqcFt/7EXz24/Cq+fqjGb9X8uR3pSnLrfODfR9dSgUK7rhT2VOFLbYSt9AyiuvQLuu3jm1tn41R1zlawrCyiAh5ZON7jdnlgxE209A+jX/EYVw6z/fHldhyFJINLtOKVREMA34GHuJLdbGoZoR9TjmrFw+gSMM+lpPSMjWSf9zTNlfALe/6pOaXwUSKEVrXAIgOR46wW+NqgZ6zY+4gM+qhZdef1KXr1obFMECc0ziialJugCx8sLJmLTAwvw6LUzLM/vsqxkdeZ859W5uGH2JIPGjJ8qLp8Yt9HIvra/Cj999yiO1HYYXFdHajuw7s/lWLuqEE/fXICta5Zi66ODDX1cEK++CBTDJLoPfj8Ms3WWffTItTNw3Sxx4ynGR+UNhuZBgDIJsBNs2Xu6ReiaiiRR4z4Kdilu5kaS8YXRSda4OFzoGQi6RWmoZKfGo6mrXzcoWQWCJyTHCSU7GF29HnWWSCHWmGKaSXkTkgx1G1q0KZeNnfYz4csnpeCOq3J1AWO3i+DRa2fglX1n1XPRnlFxbhoyU+JVpW4AOHKuHWv+dMjymDFugpq2XpwJFH0RMONj3LaqtQcuAqQnxeKCxhjbuQOZiqq2HzJrJvTz7UeFAwGT8gBgUNFlqxOWwtrV69Flkd1ePNkyXbi6tUfXg5oZlMKcVIxLiLGcLIjcpZF2H0WNURCVjFsx07sFFVgtDcMoISHWBa+PmiYM+CjFNZdlClMZI4HVoMyTOz4Bh8+1q38TKPIajZ396kPPxxdETE5PRFNnHw5VtxlqEQiUGXh+1jhcXzARBypbUdfe66hinKWZMvmGlq5+ZKXEIy8jWXXHuV3Kb99Pldn0sYYuXZqrj8K0fSigrIRWL56m9s1W0yxhHlMAlONdsFidiSBEMVCl1W06t01bz4Bp0J9SirK6Dpy70GOwGQRAWV2HWkzG896ROtw4e5JQWZbdv4HA6u1kQ5dtsym7CWyk3UdRYxSCMQgMaRhGDwNeP3LSzEXuLnR7hs0gBAvvtyYEmDUpBec7ghPs00odAEpvi+6BQKMjAGeau3G2pRufnmhSMobcRGlqY/Pbf/L1L1GYk4rHll+Goslp6kxZOzhpV2A0UPAWDN+6cjKeWDETW0qUhvTUwi1lht1gOWV8Auo7+uAPGKhdp5p14nF8OqeLADFuF7yBa3lTo2Wkxe0mKD/fIZRTBxTD1djZp2YVic6RBY1FciI8zAiLVr2EGOMb4SZqjEKoSMMwOvBTIOYSSQHzU6O0Rigwg8BgmTNs6u31UcycaF/Xcb6tF+fbevHpiUb4/dDN4rVoZ77BsuNEE/IykvE/3xtUQk1LikFnj+I6Mctg0mJ33Mxx8ajTGGBtVXN6UpyhZWdOWgKeWDELPw/IdfsCJ0AATEqNR3yMG119HrT1eoSpvVqO1HbATZQV4OHaDvgCAXK2CnJBWW0kxIqTBHj8JjaXUkhBvNGAnWGodK2G3w9pHCJMJOsM7LDyGY9m0m0ynrTYxWNCTdUFlEryZ7cf1c20OwIGgQDIGBeHJkHL3GCIj3Hp2ma63UpVs9ns/Xx7H7Z/WWvQs6IIzj3I8FGgtKYdv7itCK/tr9LFPogLaoV1jEsJ0ltJu1vd66F8D064NKZew4AoVVVb5CYzky5thiuAbUfu+ISgtq8dQUPKYxbfoICtQYhzE2gTqWLcxJC583mVEmu5ec4k3Lc4D3cvmGpIaeWpCfP98fkptn9ZawiGpyXGwsO0jPzKqiZUUm2yz4aKNApBYGYYtCmrlXGrpXG4BIn07MwpXj9Vq7adUB/CjDcYFk1Px+PL8pGdGo/slNAHOiuum5WJrWuW4he3zcW83DTcPGcS1n+7SLit10fR6/HhzqtzkRIfYwhi8xm66UlxqoGxSw91Cl/ECCgxL3YqfiirmlDZL+iwF06ixn00MWXoy1PA6EoC9O4kddUgYw2SCNDY2R+SayNSVLZ240L3gCE914yZWclo7/Wgxab/BcPtAvo9PvzkrSOovtATSI/twKlGsWotk7QQNS4iAL5+xST87XijGr843tCFGLeiMfTJ8cYhWX9WkexxsKzs9/oR6yYhtbcdikFxQtSsFJz+CJ3AVgzMKMhVg2S4GC0rFkZL1wAqmrsdGQQAmDw+Ufcsshm6myjZQzw+v+IWqmju1g2gIgmR8QE5dEU3yHhst5ugqbPPEND2+igqmy9apsbacXvxZNy7OE/pKeFgoD96vgOUUszLTcPtxZMxPSPJ8bFmTops9lHUGIWhtnzkmendgvwBvTvJLNZQGbdaGgiJBMbcfArgpjmTQFwk6J7a/ODVbqMg6vVR0ywiq8JCJ3xQ1gASOIYTmOH6qrYDH5U3YM2yyxDDa32YUDQ5bQhnak/UGIVI4WTVwP4tVw+SaEc0ZFa2dDseTLWMVOw/QeC+8Xj9aOoK3q1HoWg2bXPYQx5Q9JAiSdQYhXAFkUTYrRp4AyGNg2Q0I5BLiijtw9A4Jpxcd3mW8PUmB5IiZhyp7XBsGE83Bqf6GyxRYxSS4pwVjQwF0apBZCDYv6VrSTIUEiMUcBzu9Nu2IGUseAiULKhlszIjOvljxyoRZP9QwLbALVycb++132gIRE32UWK821ABGglYxlFFzGq1B4NWM15rGLQd3lgRHABZCCdxhNMudqMdvngsWCiUwG2fSZFaOKGApYDdcNDtQCdrKESNUbhqajo+sRDsCjfaQZ0ZCDPjAEgDIZEMBSe9Ni4VbFo4DJmoMQqHa8S9U4cDfvXAd5tyaiAAaSQkkmhnmUlMI1xEjVFoDmOdQqjYuZbY32YGApCrCIkk2kmKsMxF1BiF0YTItQTYGwhAriIkkminJYTU12CIGqMQbOe14cKpgWCvOV1FMKShkEgkwRBRo0AI+QaA3wFwA3iJUvob7v2nATwCwAugGcDDlNLqSJxLUtzwZB8NBTMDAQS/imDI1YREcmkR6cltxIwCIcQNYCOAmwDUAjhICPn/2zv3aKmq+45/vvfFS4SLIqKXZzCsEqkKN/LQqDUGH81KJOoSMRGNWSY0rtbYlVZrlyu1ljya1VrzqBo1RqtC1KSyjJaYRG1qhQKJCqgoEkUEFRQRAwoXfv3j7BkOw8zcmcucmblzfp+15t5z9tln79+ePbO/s/fZ+7cXmtlzsWi/BzrNbLukucB3gPOTsOeIQX156QCXsleT3Ia73F5EhlJ6E+Bi4Ti9haTXYiTZUzgeWGNmawEkzQc+C2RFwcwei8VfDHw+KWNe3tx7BCEf5fQi4uGl9CbAh54cp1K0lbkffLkMTchFeYYkReFI4LXY+XpgSpH4lwKP5Lsg6TLgMoCRI0dWyr5eS7FeRIZyehNQ2tBTBhcLxylMkoIg4HOTOhJLH5IVhXzNT953S9LngU7g5HzXzewW4BaAzs7OHr3jhw3sU1d+6CtJvga61N5E5lopQ08ZXCwcpzYM6teS6P7MkKworAdGxM47gA25kSSdBlwDnGxmibXaww7u27CikI9SehNQ3tBThnLFAlwwHKcSNCW9nJlkRWEpcJSkMcDrwCxgnxZD0nHAzcAZZvZWgrYwbewhVXNYVY8UapBLHXqKXytXLMAFw3EqQdJ7KUCComBmXZIuBxYRTUm93cxWSboOWGZmC4F/Bg4C7lPUmqwzs88kYc+2D2vrxKpeKWXoKUNPxQJ6LhjgouE4GTZs7bl77lJJdJ2CmT0MPJwTdm3s+LQk898n32pl1ACU06uA4mKRud5TwYDuRQNcOJx0sO7t5GdRpmZF8zmTOrhnSem7Gzn7U65YwIELBnQvGuDC4aSDnbuNi25bwp2XFpvIeWCkRhQeXfVGrU1oWIo1tAciGJk43QkCVE44wMXDqW/+9+XN3Uc6AFIjCv/lolATeioYUJpoZOJVSjigdPEAFxCn+rQW+9JUgNSIwrEjBvPK29trbYYTo7vGtDvRgMoLB5QuHuAC4lSfHV17WP7qlsTWK6RGFAYk7IPcqTylNKCVFI5M3FIFAZITEHARcQpz0xMv86OLOhNJOzUtpc8+akwqJRxQnnhk4iclIOAi4hTm+Q3JrblKjSicM6mD+UvWkZ6dXJ0MpTaUpYoHJC8gkLyIgAtJbyXJH7mpEYXVb2xzQXCKUk7jmKSAZO5JWkTAeyO9lSMH90ss7dSIwiMrN9baBKeBSEpAoHoiAt4b6a2MGzYwsbRTIwpnHj2c376U7Pxex8lHuQ1iNUQkc1+99UZcQEojSR9IqREFx+ktJC0iUL+9ER/OKo2V/qD5wPHhI6dR6UmjWK+9kSSHsxpJQJ5etyWxtFMjCj585Dh7qcfeSNLDWY3kH+u1d5JbiJsaUZg9ZSTzfvEc7+/cXWtTHKfXkXRvpBrDWY3kWPHgfq2JpZ0aUVj+6ha273JBcJxqUU8ztKrlWLFagvGRoQcllnZqRGHx2rfZ48uaHacuSXI4q5qOFau1f/nKDe9VLK1cUiMK23bsqrUJjuNUiEr3QiolHOXsX34gQrEzwVGP1IjCr55/s9YmOI5TA6rlWLHc/ctzhaIckUjSO0NqRKFHE6wdx0kFByocPdm/PFco4iLRnUAMaGvu1t6ekhpR+OIJY/i7n6+otRmO4/RSerJhVCGxyCcUcZHICEQhcRhz6IByTC+L1IjC7CkjAViwdB3PrE9uNaDjOOmjnP3L8wlFrkhkBKK5GdYwe7/0B/Vvq4TZeUmNKEAkDFu273RRcBynKuQTi1yhyBWJuECY5ReG9b54rXJMHXtIrU1wHCfF5ApFXCTiApERh3zC8Pq7OxKzL3WiAPDx0e0sfSU53yGO4zilEheJjEBkxCAuDPHexcC+yTXdZXoz6d0sf3ULF966mGUuCI7j1CHjuu5h7M572B2WIeQOK61piWYnJbmiOVWisHjt2+zs2uP7NTuOU9eM67pnP0GAvb2FdQk+U0iVKEwdewhtLU3ZQvvKBcdx6pU9YYVavimtI4f0TyzfVD1TmDyqnbu/NJXFa9+mvX8bW7bvpL1/G9f8fIX3HhzHqSvGdd3D2qbZ+0xVzQwhda6/L7F8UyUKEAnD5FHt+4SNP3wgVy54mnXvbHdxcBynLok/cH7/w+R8uaVq+KgYG7fuKCgIPsxU/7Q2wZHt/eqqrkYN6c+Q/q11ZZPTuyg0hNSe4OK1REVB0hmSVktaI+mqPNf7SFoQri+RNDpJewqxeO3b7NpduI9QTu+hUANQ7YbhTw4fSHOTaBI09yDzpgL3fOWkscyeMpKWniRK9D40Cw4/uA9nH3sEnzjq0Iq8N+d9fCRP/u2p3D93Ol8/fTxfOWnsPtdnTBjGA3On88Dc6fRtzf+xP6ZjEPNmTmTGhGFF8+rT0sTAvi00N4nmAu+viOaSv7tjF63NYsaEYbTmidhd2TPXW5pFcxG/O93ZXC7jhg6gY3DfgtdPKrPeROHPlFOY3AfOGTa/vzOxPBMTBUnNwA+AM4EJwAWSJuREuxTYYmbjgH8Fvp2UPcWYOvaQvF9YiL6MbS1NBb/8cQS0NovWZqGce/u0NjH0oMqo+7jDDmLezImMPiT/wyYBhw7sg5mxx8Lil9g3Ml6MAX32d6zVt7WJ68+eyNdPH8+4w/ad+rZq43scObgfe0rcnCK3IbDw+sK00dww6ziuOO2j+9jWUzIpTB7Vzlf/bByrNu7rb37Hrt1MHtWenYEWp6VJzJs5kQcvP5HZU0by5ZM/QksRm86Z3MGKb5zOT788jStnjOcfz564X3wJ9oT3f/ce45gRg5l/2TRmTxmZ/Uy0NYvZU0YWbNDjKdoe4+gjBuVtiJuI6rst5wPapL1pNIX8MhMtmgXHj27nyPZ+++U5b+ZEfvXXp/BvF0yiJY+LhnkzJ3LnpVO4f+50jukYVPB9imPhT66/H/dTWT4SvNRS2r7UPUrferIbdykJS9OAb5jZ6eH8agAz+2YszqIQ5ylJLcAbwFArYlRnZ6ctW7asbHtGX/WLsu9xHMepNWvbZu/n+sIMmq4rz12PpOVm1tldvCSHj44EXoudrw9heeOYWRewFai4HwoXBMdxeivFpqYmQZKikK9jmFusUuIg6TJJyyQt27RpU0WMcxzH6Q0Ueq6QFEmKwnpgROy8A9hQKE4YPhoEvJObkJndYmadZtY5dOjQhMx1HMepT3J7C3sS3HotSVFYChwlaYykNmAWsDAnzkJgTjg+F/hNsecJPeWVb/15pZN0HMepGuO6In9IZrB7N7Rcn5z7/8QWr5lZl6TLgUVAM3C7ma2SdB2wzMwWArcBd0laQ9RDmJWUPS4MjuP0biIhSHpxWaIrms3sYeDhnLBrY8cfAOclaYPjOI5TOr6i2XEcx8niouA4juNkcVFwHMdxsrgoOI7jOFlcFBzHcZwsifk+SgpJm4BXe3j7ocDmCppTr6ShnGkoI6SjnF7G6jDKzLpd/dvrROFAkLSsFIdQvZ00lDMNZYR0lNPLWF/48JHjOI6TxUXBcRzHyZI2Ubil1gZUiTSUMw1lhHSU08tYR6TqmYLjOI5TnLT1FBzHcZwipEYUJJ0habWkNZKuqrU9+ZA0QtJjkp6XtErSX4XwIZIelfRS+N8ewiXpxlCmZyVNflhUZAAAB2FJREFUiqU1J8R/SdKcWPhkSSvCPTdK0SZ/hfJIsKzNkn4v6aFwPkbSkpD/guBuHUl9wvmacH10LI2rQ/hqSafHwvPWdaE8EirfYEn3S3oh1Oe0Bq3Hr4XP6kpJ90rq2wh1Kel2SW9JWhkLq1n9Fcuj4phZw7+IXHe/DIwF2oBngAm1tiuPncOBSeF4IPAiMAH4DnBVCL8K+HY4Pgt4hGgHu6nAkhA+BFgb/reH4/Zw7f+AaeGeR4AzQ3jePBIs65XAPcBD4fynwKxwfBMwNxz/BXBTOJ4FLAjHE0I99gHGhPptLlbXhfJIqHw/Ab4UjtuAwY1Wj0Tb6f4B6Bd7fy9uhLoETgImAStjYTWrv0J5JFKvSSVcT6/w5i+KnV8NXF1ru0qw+0HgU8BqYHgIGw6sDsc3AxfE4q8O1y8Abo6F3xzChgMvxMKz8QrlkVC5OoBfA6cCD4UP+magJbe+iPbjmBaOW0I85dZhJl6hui6WRwLlO5iosVROeKPVY2aP9SGhbh4CTm+UugRGs68o1Kz+CuWRRL2mZfgo8+HNsD6E1S2ha30csAQYZmYbAcL/w0K0QuUqFr4+TzhF8kiCG4C/ATKbCh4CvGtmXXnsypYlXN8a4pdb9mJ5VJqxwCbgx4qGyG6VNIAGq0czex34LrAO2EhUN8tprLqMU8v6q1oblhZRUJ6wup12Jekg4AHgCjN7r1jUPGHWg/CqIenTwFtmtjwenCeqdXOtnsveQjT08O9mdhzwR6KhgELUc1kKEsa7P0s05HMEMAA4M0/U3lyXpVAN+6tW5rSIwnpgROy8A9hQI1uKIqmVSBDuNrOfheA3JQ0P14cDb4XwQuUqFt6RJ7xYHpXmBOAzkl4B5hMNId0ADJaU2Qkwble2LOH6IKKtW8st++YieVSa9cB6M1sSzu8nEolGqkeA04A/mNkmM9sF/AyYTmPVZZxa1l/V2rC0iMJS4KgwY6GN6CHXwhrbtB9hBsJtwPNm9i+xSwuBzMyFOUTPGjLhF4WZCVOBraHLuQiYIak9/JqbQTTmuhHYJmlqyOuinLTy5VFRzOxqM+sws9FE9fAbM7sQeAw4t0AZM3adG+JbCJ8VZrSMAY4ieniXt67DPYXyqHQZ3wBekzQ+BH0SeI4GqsfAOmCqpP7Bjkw5G6Yuc6hl/RXKo/Ik8aCiHl9ET+9fJJrNcE2t7Slg44lEXcJngafD6yyiMdRfAy+F/0NCfAE/CGVaAXTG0voisCa8LomFdwIrwz3fZ+8Cxrx5JFzeU9g7+2gsUUOwBrgP6BPC+4bzNeH62Nj914RyrCbM3ihW14XySKhsxwLLQl3+J9Hsk4arR+AfgBeCLXcRzSDq9XUJ3Ev0nGQX0a/0S2tZf8XyqPTLVzQ7juM4WdIyfOQ4juOUgIuC4ziOk8VFwXEcx8niouA4juNkcVFwHMdxsrgoOA2BpGsUeet8VtLTkqaUef/Fko4o857RcS+aPaVS6ThOJWjpPorj1DeSpgGfJvIw+6GkQ4m8apZ6fzORd8+V1OlKd8epFt5TcBqB4cBmM/sQwMw2m9kGAEmfDE7pVijykd8nhL8i6VpJ/0PkpbITuDv0MvoFf/dPSFouaVHM9cBkSc9Iegr4aj5jFPn3Pyt2foekc0KP4LeSfhde0/Pce7Gk78fOH5J0SjieIempcO99wUcWkr4l6bnQS/puJd5QJ724KDiNwC+BEZJelPRDSScDSOoL3AGcb2YTiXrGc2P3fWBmJ5rZfxCtPr7QzI4FuoDvAeea2WTgduCfwj0/Bv7SzKYVsWc+cH6woY3I/cPDRH5sPmVmk8L1G0stYOj9/D1wWrh/GXClpCHATOBjZvanwPWlpuk4+XBRcHo9ZvY+MBm4jMhl9QJJFwPjiRy2vRii/oRo85QMCwokOR44GnhU0tNEjXGHpEHAYDN7IsS7q8D9jwCnhl7JmcB/m9kOoBX4kaQVRK4ZJpRRzKkh/pPBpjnAKOA94APgVkmfA7aXkabj7Ic/U3AaAjPbDTwOPB4a3TlEvqOK8ccC4QJW5fYGJA2mBHfFZvaBpMeJNpw5n8iPDsDXgDeBY4h+kH2Q5/Yu9v2x1jdm06NmdsF+xkrHE/VGZgGXE3medZwe4T0Fp9cjabyko2JBxwKvEjlqGy1pXAj/AvBE7v2BbURboELklG1oeICNpFZJHzOzd4Gtkk4M8S4sYtZ84BLgE0TeMiFyFb3RzPYEW5rz3PcKcKykJkkjgOND+GLghExZgmfSj4bnCoPM7GHgilB2x+kx3lNwGoGDgO+FX/JdRB4pLwu/2C8B7lPke38p0X6++bgDuEnSDqLtHc8FbgxDRi1Eez6sImrob5e0nb2NfT5+CdxJ5Op5Zwj7IfCApPOIXD/n66k8SbSV5wqi2VC/AzCzTWFI7N7Mw3KiYa1twIPh+YmIeiOO02PcS6rjOI6TxYePHMdxnCwuCo7jOE4WFwXHcRwni4uC4ziOk8VFwXEcx8niouA4juNkcVFwHMdxsrgoOI7jOFn+Hx0kVPcJSXgrAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "for similarity_heuristic in [\"pearson\", \"cosine\"]:\n",
    "    W_sparse = similarity_dict[similarity_heuristic]\n",
    "    \n",
    "    # Sort similarities according to cosine\n",
    "    similarity_values = np.array(W_sparse[W_cosine.nonzero()]).ravel()\n",
    "    \n",
    "    pyplot.plot(similarity_values[cosine_sorted_coordinates], \n",
    "                label=similarity_heuristic,\n",
    "                marker=\".\",\n",
    "                linestyle =\"\")\n",
    "    \n",
    "    \n",
    "pyplot.ylabel('Similarity')\n",
    "pyplot.xlabel('Sorted values')\n",
    "pyplot.legend()\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Comparing CF and CBF item-based KNNs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<10681x10237 sparse matrix of type '<class 'numpy.float64'>'\n",
       "\twith 130127 stored elements in Compressed Sparse Row format>"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ICM_all = dataset.get_loaded_ICM_dict()[\"ICM_all\"]\n",
    "ICM_all"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Rewrite the content-based recommender"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ItemKNNCBFRecommender: URM Detected 68 (0.64 %) cold items.\n",
      "ItemKNNCFRecommender: URM Detected 68 (0.64 %) cold items.\n",
      "Similarity column 10681 ( 100 % ), 6040.94 column/sec, elapsed time 0.03 min\n",
      "Similarity column 10681 ( 100 % ), 1132.24 column/sec, elapsed time 0.16 min\n",
      "EvaluatorHoldout: Processed 60000 ( 85.96% ) in 30.28 sec. Users per second: 1982\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 35.13 sec. Users per second: 1987\n",
      "EvaluatorHoldout: Processed 60000 ( 85.96% ) in 30.17 sec. Users per second: 1988\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 35.09 sec. Users per second: 1989\n",
      "Similarity column 10681 ( 100 % ), 6138.15 column/sec, elapsed time 0.03 min\n",
      "Similarity column 10681 ( 100 % ), 1107.12 column/sec, elapsed time 0.16 min\n",
      "EvaluatorHoldout: Processed 57000 ( 81.66% ) in 30.42 sec. Users per second: 1874\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 37.32 sec. Users per second: 1871\n",
      "EvaluatorHoldout: Processed 61000 ( 87.39% ) in 30.35 sec. Users per second: 2010\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 34.72 sec. Users per second: 2010\n",
      "Similarity column 10681 ( 100 % ), 6195.12 column/sec, elapsed time 0.03 min\n",
      "Similarity column 10681 ( 100 % ), 1133.92 column/sec, elapsed time 0.16 min\n",
      "EvaluatorHoldout: Processed 54000 ( 77.36% ) in 30.23 sec. Users per second: 1786\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 39.15 sec. Users per second: 1783\n",
      "EvaluatorHoldout: Processed 59000 ( 84.52% ) in 30.64 sec. Users per second: 1926\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 36.44 sec. Users per second: 1916\n",
      "Similarity column 10681 ( 100 % ), 5976.71 column/sec, elapsed time 0.03 min\n",
      "Similarity column 10681 ( 100 % ), 1060.83 column/sec, elapsed time 0.17 min\n",
      "EvaluatorHoldout: Processed 56000 ( 80.23% ) in 30.27 sec. Users per second: 1850\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 37.58 sec. Users per second: 1857\n",
      "EvaluatorHoldout: Processed 56000 ( 80.23% ) in 30.14 sec. Users per second: 1858\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 37.47 sec. Users per second: 1863\n",
      "Similarity column 10681 ( 100 % ), 6044.36 column/sec, elapsed time 0.03 min\n",
      "Similarity column 10681 ( 100 % ), 1120.59 column/sec, elapsed time 0.16 min\n",
      "EvaluatorHoldout: Processed 52000 ( 74.50% ) in 30.42 sec. Users per second: 1710\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 40.66 sec. Users per second: 1717\n",
      "EvaluatorHoldout: Processed 56000 ( 80.23% ) in 30.17 sec. Users per second: 1856\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 37.60 sec. Users per second: 1856\n",
      "Similarity column 10681 ( 100 % ), 6047.79 column/sec, elapsed time 0.03 min\n",
      "Similarity column 10681 ( 100 % ), 1112.89 column/sec, elapsed time 0.16 min\n",
      "EvaluatorHoldout: Processed 49000 ( 70.20% ) in 30.24 sec. Users per second: 1621\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 42.95 sec. Users per second: 1625\n",
      "EvaluatorHoldout: Processed 56000 ( 80.23% ) in 30.29 sec. Users per second: 1849\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 37.83 sec. Users per second: 1845\n",
      "Similarity column 10681 ( 100 % ), 5865.12 column/sec, elapsed time 0.03 min\n",
      "Similarity column 10681 ( 100 % ), 1087.62 column/sec, elapsed time 0.16 min\n",
      "EvaluatorHoldout: Processed 53000 ( 75.93% ) in 30.08 sec. Users per second: 1762\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 39.59 sec. Users per second: 1763\n",
      "EvaluatorHoldout: Processed 52000 ( 74.50% ) in 30.55 sec. Users per second: 1702\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 41.02 sec. Users per second: 1702\n",
      "Similarity column 10681 ( 100 % ), 5926.96 column/sec, elapsed time 0.03 min\n",
      "Similarity column 10681 ( 100 % ), 1117.90 column/sec, elapsed time 0.16 min\n",
      "EvaluatorHoldout: Processed 48000 ( 68.77% ) in 30.29 sec. Users per second: 1585\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 44.02 sec. Users per second: 1586\n",
      "EvaluatorHoldout: Processed 51000 ( 73.06% ) in 30.19 sec. Users per second: 1689\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 41.24 sec. Users per second: 1692\n",
      "Similarity column 10681 ( 100 % ), 5900.77 column/sec, elapsed time 0.03 min\n",
      "Similarity column 10681 ( 100 % ), 1122.24 column/sec, elapsed time 0.16 min\n",
      "EvaluatorHoldout: Processed 46000 ( 65.90% ) in 30.34 sec. Users per second: 1516\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 45.94 sec. Users per second: 1519\n",
      "EvaluatorHoldout: Processed 51000 ( 73.06% ) in 30.38 sec. Users per second: 1679\n",
      "EvaluatorHoldout: Processed 69802 ( 100.00% ) in 41.46 sec. Users per second: 1683\n"
     ]
    }
   ],
   "source": [
    "from KNN.ItemKNNCBFRecommender import ItemKNNCBFRecommender\n",
    "from KNN.ItemKNNCFRecommender import ItemKNNCFRecommender\n",
    "\n",
    "content_recommender = ItemKNNCBFRecommender(URM_train, ICM_all)\n",
    "content_MAP = []\n",
    "\n",
    "collaborative_recommender = ItemKNNCFRecommender(URM_train)\n",
    "collaborative_MAP = []\n",
    "\n",
    "x_tick = []\n",
    "\n",
    "for topK in [50, 100, 200]:\n",
    "    for shrink in [10, 50, 100]:\n",
    "        \n",
    "        x_tick.append(\"topk {}, shrink {}\".format(topK, shrink))\n",
    "        \n",
    "        content_recommender.fit(shrink=shrink, topK=topK)\n",
    "        collaborative_recommender.fit(shrink=shrink, topK=topK)\n",
    "        \n",
    "        result_dict, _ = evaluator_test.evaluateRecommender(content_recommender)\n",
    "        content_MAP.append(result_dict[10][\"MAP\"])\n",
    "        \n",
    "        result_dict, _ = evaluator_test.evaluateRecommender(collaborative_recommender)\n",
    "        collaborative_MAP.append(result_dict[10][\"MAP\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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uMnd/zvR/UEzO333hyUiItJesQnrr9z9xWQHMzvV3V9y9y+UIC4RSbEdO3ZQV1dHY2NjT4ciUWVlJaNHj6Zv3749HcpOKzZh3QZMyun2vTzdRESoq6tj8ODBVFdXY2Y9Hc4+z9157733qKurY+zYsT0dzk7rNGGZ2cnAKUCVmf1dotcQQP/NEpG8Ghsblax6ETNj+PDh1NfX93Qou6SrFlYFMCgONzjRfRMwo1RBiUj6KVn1LnvD8uj0KkF3/6273whMdfcbE69b3H3pHopRRGSnrFmzhpkzZ3L44Yczbtw4zj//fJYsWZJ32BUrVnDccccB8Nxzz/HRj36002nfe++9XHXVVbs9ZoBbb72VrVu3tn0///zz+eCDD0ryW2nSacIys1vjx++b2SO5rz0Qn4jITnF3PvaxjzFt2jTeeustFi5cyDe+8Q3Wrl3b06Hh7rS2thbsn5uwHnvsMfbbb789EVqv1tX/sH4a328m/Pcq9yUi0is9++yz9O3blyuuuKKt24knnshpp53GF7/4RY477jiOP/547r///k6n8/LLL3PKKacwceJETjnlFBYvXtzWb+XKlZx77rkcffTR3HjjjW3db7nlFo477jiOO+44br017PevWLGCY489liuvvJJJkyaxcuVKPv/5z1NTU8P48eO5/vrrAbjttttYtWoV06dPZ/r06QBUV1ezfv16/uEf/oE77rij7XduuOEGvvOdUBXfdNNNTJ48mQkTJrRNa2/T6Tksd58fb3z7v939U3soJhHZi9z46wUsXLVpt05z3EFDuP7C8Z0O88Ybb3DSSSd16P7QQw/x6quv8qc//Yn169czefJkTj+98N9JjznmGJ5//nnKy8t5+umn+cd//Ed+9atfASGZvfHGGwwYMIDJkydzwQUXYGb86Ec/4g9/+APuzoc+9CHOOOMMhg0bxuLFi/nRj37UlnS+/vWvs//++9PS0sJZZ53Fa6+9xhe+8AVuueUWnn32WQ444IB2scycOZOrr76aK6+8EoAHHniAJ554grlz57J06VJefvll3J2LLrqI559/vtP5SqMuL2t39xYzqzKzCndv2hNBiYiUyosvvsill15KWVkZI0aM4IwzzmDevHlMmDAh7/AbN25k1qxZLF26FDNjx44dbf3OPvtshg8fDsDHP/5xXnzxRcyMj33sYwwcOLCt+wsvvMBF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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "pyplot.plot(x_tick, collaborative_MAP, label=\"Collaborative\")\n",
    "pyplot.plot(x_tick, content_MAP, label=\"Content\")   \n",
    "\n",
    "pyplot.ylabel('Similarity')\n",
    "pyplot.xlabel('Sorted values')\n",
    "pyplot.legend()\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "W_collaborative = collaborative_recommender.W_sparse\n",
    "W_content = content_recommender.W_sparse\n",
    "    \n",
    "# Sort similarities according to cosine\n",
    "collaborative_similarity_values = np.array(W_collaborative[W_collaborative.nonzero()]).ravel()\n",
    "content_similarity_values = np.array(W_content[W_collaborative.nonzero()]).ravel()\n",
    "\n",
    "sorted_args = np.argsort(-collaborative_similarity_values)\n",
    "\n",
    "pyplot.plot(content_similarity_values[sorted_args], \n",
    "            label=\"Content\",\n",
    "            marker=\".\",\n",
    "            linestyle =\"\")\n",
    "\n",
    "pyplot.plot(collaborative_similarity_values[sorted_args], \n",
    "            label=\"Collaborative\",\n",
    "            marker=\".\",\n",
    "            linestyle =\"\")\n",
    "    \n",
    "pyplot.ylabel('Model')\n",
    "pyplot.xlabel('Sorted values')\n",
    "pyplot.legend()\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "sorted_args = np.argsort(-content_similarity_values)\n",
    "\n",
    "pyplot.plot(collaborative_similarity_values[sorted_args], \n",
    "            label=\"Collaborative\",\n",
    "            marker=\".\",\n",
    "            linestyle =\"\")\n",
    "\n",
    "pyplot.plot(content_similarity_values[sorted_args], \n",
    "            label=\"Content\",\n",
    "            marker=\".\",\n",
    "            linestyle =\"\")\n",
    "    \n",
    "pyplot.ylabel('Model')\n",
    "pyplot.xlabel('Sorted values')\n",
    "pyplot.legend()\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Collaborative is outperforming content-based by a large margin, as we could expect"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Let's try to see how the recommendations are distributed"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Recommended to user 0/69878\n",
      "Recommended to user 10000/69878\n",
      "Recommended to user 20000/69878\n",
      "Recommended to user 30000/69878\n",
      "Recommended to user 40000/69878\n",
      "Recommended to user 50000/69878\n",
      "Recommended to user 60000/69878\n"
     ]
    }
   ],
   "source": [
    "x_tick = np.arange(URM_all.shape[1])\n",
    "counter_content = np.zeros(URM_all.shape[1])\n",
    "counter_collaborative = np.zeros(URM_all.shape[1])\n",
    "\n",
    "for user_id in range(URM_all.shape[0]):\n",
    "    recs = collaborative_recommender.recommend(user_id)[:10]\n",
    "    counter_collaborative[recs] += 1\n",
    "    \n",
    "    recs = content_recommender.recommend(user_id)[:10]\n",
    "    counter_content[recs] += 1\n",
    "    \n",
    "    if user_id % 10000 == 0:\n",
    "        print(\"Recommended to user {}/{}\".format(user_id, URM_all.shape[0]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZUAAAEKCAYAAADaa8itAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3XmcVNWZ//HP002zyCIIqAhio2GMggqIiktcR8UlLhnND80YkjFBEx3jJJmISRSNMaNG0TiJiURRs4kMESUGRTQoLpHNhR1pFaUFoQHZoenl+f1xTzcFVHffbqq6qqu+79erXl117rm3zu3bXU+d5Z5j7o6IiEgqFGS6ACIikjsUVEREJGUUVEREJGUUVEREJGUUVEREJGUUVEREJGUUVEREJGUUVEREJGUUVEREJGVaZboAza1bt25eXFyc6WKIiLQoc+bMWePu3RvKl3dBpbi4mNmzZ2e6GCIiLYqZfRwnn5q/REQkZRRUREQkZRRUREQkZfKuT0VEskdFRQWlpaVs374900WRoG3btvTq1YuioqIm7a+gIiIZU1paSseOHSkuLsbMMl2cvOfurF27ltLSUvr06dOkY6St+cvM2prZTDN7z8wWmNntIb2Pmc0ws6Vm9pSZtQ7pbcLrkrC9OOFYN4f0JWZ2bkL60JBWYmYj03UuIpIe27dvp2vXrgooWcLM6Nq1617VHNPZp1IOnOnuxwADgKFmNgS4G7jf3fsCnwNXh/xXA5+7+xeA+0M+zOxIYBjQDxgKPGRmhWZWCPwGOA84Ergi5BWRFkQBJbvs7fVIW1DxyObwsig8HDgTmBDSnwAuCc8vDq8J28+y6OwuBsa5e7m7fwSUAMeHR4m7f+juO4BxIW+L8/6qTcz8aF2miyEistfSOvor1CjeBVYDU4EPgPXuXhmylAI9w/OewHKAsH0D0DUxfbd96kpvcc65fzpfffifmS6GSF767LPPGDZsGIcddhhHHnkk559/Pu+//36jj/PAAw+wdevWJpfjlVde4c0332zy/tkirUHF3avcfQDQi6hmcUSybOFnsjqXNyF9D2Y2wsxmm9nssrKyhgsuInnB3bn00ks5/fTT+eCDD1i4cCG/+MUvWLVqVaOPpaASaZb7VNx9PfAKMATobGY1o856ASvC81LgYICwfV9gXWL6bvvUlZ7s/ce4+2B3H9y9e4NT14hInpg2bRpFRUVce+21tWkDBgzglFNO4b//+7/p378/Rx11FE899RQQffCffvrpXHbZZXzxi1/ka1/7Gu7Ogw8+yIoVKzjjjDM444wzAHjxxRc58cQTGTRoEJdffjmbN0e9AcXFxYwaNYpBgwZx1FFHsXjxYpYtW8bvfvc77r//fgYMGMBrr73W/L+MFEnbkGIz6w5UuPt6M2sH/CtR5/s04DKiPpDhwLNhl0nh9T/D9n+4u5vZJOAvZjYaOAjoC8wkqqn0NbM+wKdEnflXput8RCS9bv/bAhau2JjSYx55UCdGfblfndvnz5/Pscceu0f6008/zbvvvst7773HmjVrOO644zj11FMBeOedd1iwYAEHHXQQJ598Mm+88QY33HADo0ePZtq0aXTr1o01a9bw85//nJdeeon27dtz9913M3r0aG699VYAunXrxttvv81DDz3EvffeyyOPPMK1115Lhw4d+OEPf5jS30FzS+d9Kj2AJ8IorQJgvLs/Z2YLgXFm9nPgHeDRkP9R4I9mVkJUQxkG4O4LzGw8sBCoBK5z9yoAM7semAIUAmPdfUEaz0dE8sTrr7/OFVdcQWFhIQcccACnnXYas2bNolOnThx//PH06tULiGo1y5Yt45RTTtll/7feeouFCxdy8sknA7Bjxw5OPPHE2u1f+cpXADj22GN5+umnm+msmkfagoq7zwUGJkn/kKh/Zff07cDldRzrTuDOJOmTgcl7XVgRybj6ahTp0q9fPyZMmLBHunvS7lkA2rRpU/u8sLCQysrKPfK4O2effTZPPvlkvceoa/+WTHN/iUjeOvPMMykvL+f3v/99bdqsWbPo0qULTz31FFVVVZSVlTF9+nSOP36P78K76NixI5s2bQJgyJAhvPHGG5SUlACwdevWBkeUJe7fkimoiEjeMjMmTpzI1KlTOeyww+jXrx+33XYbV155JUcffTTHHHMMZ555Jvfccw8HHnhgvccaMWIE5513HmeccQbdu3fn8ccf54orruDoo49myJAhLF68uN79v/zlLzNx4sQW31Fv9VXzctHgwYM92xbpKh75dwCW3XVBhksi0rwWLVrEEUcku9NAMinZdTGzOe4+uKF9VVMREZGUUVAREZGUUVAREZGUUVAREZGUUVAREZGUUVAREZGUUVARkbzWmKnvly1bRv/+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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "sorted_items = np.argsort(-counter_collaborative)\n",
    "       \n",
    "pyplot.plot(x_tick, counter_content[sorted_items], label = \"Content\")\n",
    "pyplot.plot(x_tick, counter_collaborative[sorted_items], label = \"Collaborative\")\n",
    "\n",
    "pyplot.ylabel('Number of recommendations')\n",
    "pyplot.xlabel('Items')\n",
    "pyplot.legend()\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZUAAAEKCAYAAADaa8itAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3XmcVOWZ9//P1U1DI6AsokFQQX9MFFAWEVEc16i4xG10HjCPomMGk2gSs0yCSdyiJpooMf5GjUQRM0lEhoiSiAIa0KiRzYVVpAWUBmQR2demr+ePczcUTS2nm6ru6q7v+/WqV1XdZ6nrdEFffa/H3B0REZFsKKrvAEREpPFQUhERkaxRUhERkaxRUhERkaxRUhERkaxRUhERkaxRUhERkaxRUhERkaxRUhERkaxpUt8B1LVDDz3UO3fuXN9hiIg0KLNmzVrr7u0z7VdwSaVz587MnDmzvsMQEWlQzOyTOPup+UtERLJGSUVERLJGSUVERLKm4PpURCR/7Nq1i/LycrZv317foUhQWlpKp06dKCkpqdXxSioiUm/Ky8tp1aoVnTt3xszqO5yC5+58/vnnlJeX06VLl1qdI2fNX2ZWambTzewDM5tnZneH8i5mNs3MFpnZc2bWNJQ3C+/LwvbOCee6LZQvNLMLEsoHhrIyMxuWq2sRkdzYvn077dq1U0LJE2ZGu3btDqjmmMs+lR3AOe7eE+gFDDSz/sADwG/cvSvwBXBj2P9G4At3//+A34T9MLNuwCCgOzAQeMzMis2sGHgUuBDoBgwO+4pIA6KEkl8O9PvIWVLxyObwtiQ8HDgHGBvKnwEuD68vC+8J28+16OouA0a7+w53XwKUAf3Co8zdF7v7TmB02Dc3po2AuX/J2elFRBqDnI7+CjWK94HVwGTgY2C9u1eEXcqBjuF1R2AZQNi+AWiXWF7tmFTluTHzKZj/Ys5OLyL147PPPmPQoEEce+yxdOvWjYsuuoiPPvoo6b5Lly6lR48eAEydOpVLLrkk7blHjRrFLbfckvWYAR5++GG2bt265/1FF13E+vXrc/JZNZHTpOLuu929F9CJqGZxfLLdwnOyOpfXonw/ZjbUzGaa2cw1a9ZkDjwVT3p6EWmg3J0rrriCs846i48//pj58+fzi1/8glWrVtV3aLg7lZWVKbdXTyoTJkygdevWdRFaWnUyT8Xd1wNTgf5AazOrGnXWCVgRXpcDRwKE7YcA6xLLqx2TqjzZ549w977u3rd9+4xL16RgpMhZItJATZkyhZKSEr7xjW/sKevVqxenn346//Vf/0WPHj044YQTeO6559KeZ/r06Zx22mn07t2b0047jYULF+7ZtmzZMgYOHMiXv/xl7r777j3lw4cPp0ePHvTo0YOHH34YiGpCxx9/PN/61rfo06cPy5Yt45vf/CZ9+/ale/fu3HnnnQA88sgjrFixgrPPPpuzzz4biJagWrt2LT/+8Y957LHH9nzOXXfdxUMPPQTAr3/9a04++WROPPHEPefKtpwNKTaz9sAud19vZs2BrxB1vk8BriLqAxkCVLUpjQ/v/xm2/93d3czGA382s+HAEUBXYDrRb/muZtYFWE7UmX9Nrq4HdSaK5NTdf53H/BUbs3rObkcczJ1f7Z5y+9y5cznppJP2K3/++ed5//33+eCDD1i7di0nn3wyZ5xxRsrzHHfccbzxxhs0adKEV199lZ/85Cf85S9RH+z06dOZO3cuBx10ECeffDIXX3wxZsbTTz/NtGnTcHdOOeUUzjzzTNq0acPChQt5+umn9ySG++67j7Zt27J7927OPfdcZs+ezXe+8x2GDx/OlClTOPTQQ/eJZdCgQdx6661861vfAmDMmDG88sorTJo0iUWLFjF9+nTcnUsvvZQ33ngj7XXVRi7nqXQAngmjtIqAMe7+NzObD4w2s3uB94Cnwv5PAf9jZmVENZRBAO4+z8zGAPOBCuBmd98NYGa3ABOBYmCku8/L4fWo+UukQLz55psMHjyY4uJiDj/8cM4880xmzJjBiSeemHT/DRs2MGTIEBYtWoSZsWvXrj3bzjvvPNq1awfAlVdeyZtvvomZccUVV9CiRYs95f/4xz+49NJLOfroo+nfv/+e48eMGcOIESOoqKhg5cqVzJ8/P2UcAL1792b16tWsWLGCNWvW0KZNG4466igeeeQRJk2aRO/evQHYvHkzixYtajhJxd1nA72TlC8m6l+pXr4duDrFue4D7ktSPgGYcMDBxqKaikgupatR5Er37t0ZO3bsfuVewz8gb7/9ds4++2zGjRvH0qVLOeuss/Zsqz5E18zSnr8q0QAsWbKEBx98kBkzZtCmTRuuv/76WHNIrrrqKsaOHbtnEELVNd12223cdNNNNbq2mtLaXyJSsM455xx27NjB73//+z1lVb/An3vuOXbv3s2aNWt444036Ndvv7+F99iwYQMdO0aDT0eNGrXPtsmTJ7Nu3Tq2bdvGCy+8wIABAzjjjDN44YUX2Lp1K1u2bGHcuHH867/+637n3bhxIy1atOCQQw5h1apVvPzyy3u2tWrVik2bNiWNZ9CgQYwePZqxY8dy1VVXAXDBBRcwcuRINm+OZnosX76c1atXx/tB1YCWaYnLTM1fIo2MmTFu3DhuvfVW7r//fkpLS+ncuTMPP/wwmzdvpmfPnpgZv/rVr/jSl77E0qVLk57nRz/6EUOGDGH48OGcc845+2w7/fTTufbaaykrK+Oaa66hb9++AFx//fV7EtXXv/51evfuvd/5e/bsSe/evenevTvHHHMMAwYM2LNt6NChXHjhhXTo0IEpU6bsc1z37t3ZtGkTHTt2pEOHDgCcf/75LFiwgFNPPRWAli1b8sc//pHDDjus1j+/ZKym1byGrm/fvl6rm3Q9fjq0PgoG/zn7QYkUqAULFnD88clmGkh9Sva9mNksd++b6Vg1f9VIYSVgEZGaUlKJS/30IiIZKanURIE1FYqI1JSSSmyaUS8ikomSSlyaUS8ikpGSSk2o+UtEJC0lldjU/CXSGNVk6ft0qq8aXFNTp07l7bffrvXx+UJJJS41f4k0Otlc+l5JJaKkUhNq/hJpVGq69P3UqVM566yzuOqqqzjuuOP42te+hrsnXYp+0qRJnHrqqfTp04err756z/IonTt35s4776RPnz6ccMIJfPjhhyxdupTf/e53/OY3v6FXr1784x//qPsfRpZomZbYVFMRyamXh8Fnc7J7zi+dABfen3JzbZa+f++995g3bx5HHHEEAwYM4K233tpvKfq1a9dy77338uqrr9KiRQseeOABhg8fzh133AHAoYceyrvvvstjjz3Ggw8+yJNPPsk3vvENWrZsyQ9/+MPs/gzqmGoqNaKaikghSLX0PUC/fv3o1KkTRUVF9OrVK+l6YO+88w7z589nwIAB9OrVi2eeeYZPPvlkz/Yrr7wSgJNOOinlemINlWoqcWlBSZHcSlOjyJXaLH3frFmzPa+Li4upqKhIevx5553Hs88+m/YcqY5vyFRTiU3NXyKNTbaWvod9l6Lv378/b731FmVlZQBs3bo144iydEvZNyRKKjWimopIY1K19P3kyZM59thj6d69O3fddRfXXHMNJ554Ij179uScc87Zs/R9OlVL0Z999tm0b9+eUaNGMXjwYE488UT69+/Phx9+mPb4r371q4wbN67Bd9Rr6fu4nvwKNGsF147LflAiBUpL3+cnLX1fVwosAYuI1JSSSmyaUS8ikomSSlyaUS+SE4XWBJ/vDvT7UFKpCf3jF8mq0tJSPv/8cyWWPOHufP7555SWltb6HBnnqZjZ1cAr7r7JzH4G9AHudfd3a/2pDZJqKiLZ1qlTJ8rLy1mzZk19hyJBaWkpnTp1qvXxcSY/3u7u/2tmpwMXAA8CjwOn1PpTGyz9NSWSTSUlJXTp0qW+w5AsitP8tTs8Xww87u4vAk0zHWRmR5rZFDNbYGbzzOy7ofwuM1tuZu+Hx0UJx9xmZmVmttDMLkgoHxjKysxsWEJ5FzObZmaLzOw5M8sYV61pRr2ISEZxkspyM3sC+Hdggpk1i3lcBfADdz8e6A/cbGbdwrbfuHuv8JgAELYNAroDA4HHzKzYzIqBR4ELgW7A4ITzPBDO1RX4ArgxRly1pOYvEZFM4iSHfwcmAgPdfT3QFvivTAe5+8qqfhd33wQsADqmOeQyYLS773D3JUAZ0C88ytx9sbvvBEYDl5mZAecAVQv3PANcHuN6REQkRzImFXffCrwIbDGzo4ASIP16A9WYWWegNzAtFN1iZrPNbKSZtQllHYFlCYeVh7JU5e2A9e5eUa08NzSkWEQko4xJxcy+DawCJgMvhcff4n6AmbUE/gLc6u4biTr5jwV6ASuBh6p2TXK416I8WQxDzWymmc08oFEm6lMREUkrzuiv7wJfdvfPa3pyMyshSih/cvfnAdx9VcL237M3QZUDRyYc3glYEV4nK18LtDazJqG2krj/Ptx9BDACorW/anodIVo0+ktEJL04fSrLgA01PXHo83gKWODuwxPKOyTsdgUwN7weDwwys2Zm1gXoCkwHZgBdw0ivpkSd+eM9mi01BbgqHD+EqJkuN9T8JSKSUZyaymJgqpm9BOyoKkxMFCkMAK4F5pjZ+6HsJ0Sjt3oR/dm/FLgpnG+emY0B5hONHLvZ3XcDmNktRIMFioGR7j4vnO/HwGgzuxd4jyiJ5Y6av0RE0oqTVD4Nj6bEmJ9Sxd3fJHm/x4Q0x9wH3JekfEKy49x9MdHoMBERyQMZk4q73w1gZq2it74551HlLdVURETSiTP6q4eZvUfU9zHPzGaZWffch5ZnNKNeRCSjOB31I4Dvu/vR7n408APg9xmOaYTUUS8ikkmcpNLC3adUvXH3qUCLnEWU11RTERFJJ9boLzO7Hfif8P7/AktyF1KeUvOXiEhGcWoq/wG0B54HxoXXN+QyqPyk5i8RkUzijP76AvhOHcTSAKimIiKSTsqkYmYPu/utZvZXkvw2dfdLcxpZvtGMehGRjNLVVKr6UB6si0AaBPWpiIiklTKpuPus8LKXu/82cVu4i+PruQws/2hBSRGRTOJ01A9JUnZ9luPIf2r+EhHJKF2fymDgGqCLmY1P2NQKqPEy+I2Cmr9ERNJK16fyNtFNtA5l7420ADYBs3MZVH5STUVEJJN0fSqfAJ8Ap9ZdOPlONRURkXTiLCjZ38xmmNlmM9tpZrvNbGNdBJdXNKNeRCSjOB31/w0MBhYBzYGvA/9/LoPKT2r+EhHJJM7aX7h7mZkVhzsxPm1mb+c4rjylmoqISDpxksrWcG/4983sV0Sd94W3SrGGFIuIZBSn+etaonvD3wJsAY4E/i2XQeUt9amIiKQVZ0HJT8LLbcDduQ0nn2lGvYhIJukmP84hzW9Rdz8xJxHlKzV/iYhklK6mckl4vjk8Vy0w+TVga84iymeqqIiIpJVp8iNmNsDdByRsGmZmbwE/z3Vw+UU1FRGRTGLdo97MTq96Y2anUYijvwBVVURE0ouTVG4EHjWzpWa2FHiM6BbDaZnZkWY2xcwWmNm8sFw+ZtbWzCab2aLw3CaUm5k9YmZlZjbbzPoknGtI2H+RmQ1JKD/JzOaEYx4xy2HHh2bUi4hklDGpuPssd+8JnAj0dPde7v5ujHNXAD9w9+OB/sDNZtYNGAa85u5dgdfCe4ALga7hMRR4HKIkBNwJnAL0A+6sSkRhn6EJxw2MEZeIiORIxiHFZtaMaF5KZ6BJVWXA3dP2qbj7SqKJkrj7JjNbAHQELgPOCrs9A0wFfhzK/+DuDrxjZq3NrEPYd7K7rwvxTAYGmtlU4GB3/2co/wNwOfByrCuvFdVURETSiTOj/kVgAzAL2FGbDzGzzkBvYBpweEg4uPtKMzss7NYRWJZwWHkoS1denqQ8NzSkWEQkozhJpZO717pZycxaAn8BbnX3jWm6PZJt8FqUJ4thKFEzGUcddVSmkFNTn4qISFpxOurfNrMTanNyMyshSih/cvfnQ/Gq0KxFeF4dysuJloCp0glYkaG8U5Ly/bj7CHfv6+5927dvX5tLQTPqRUQyi5NUTgdmmdnCMCprjpllvPNjGIn1FLDA3YcnbBrP3vveDyFqXqsqvy6MAusPbAjNZBOB882sTeigPx+YGLZtCvd7MeC6hHNln5q/REQyitP8dWEtzz2AaDHKOWb2fij7CXA/MMbMbgQ+Ba4O2yYAFwFlRDP2bwBw93Vmdg8wI+z386pOe+CbwCii+7y8TE476VHzl4hIBrEWlAyTH7u6+9Nm1h5oGeO4N0k9Df3cJPs7e5eEqb5tJDAySflMoEemWLJDzV8iIpnEuZ3wnURDfm8LRSXAH3MZVF5S85eISEZx+lSuAC4lupcK7r4CaJXLoPKWmr9ERNKKk1R2hqYpBzCzAl33SzUVEZFM4iSVMWb2BNDazP4TeBX4fW7DyleqqYiIpBOno/5BMzsP2Ah8GbjD3SfnPLJ8owUlRUQyijOkGHefbGbTqvY3s7YJw3oLhJq/REQyibOg5E1EN+TaBlSyd2ztMbkNLR+ppiIikk6cmsoPge7uvjbXweQ1DSkWEckoTkf9xxTqPemrU5+KiEhacWoqtxEtKjmNhKXv3f07OYsqL2lGvYhIJnGSyhPA34E5RH0qhUnNXyIiGcVJKhXu/v2cR9IQqPlLRCStOH0qU8xsqJl1MLO2VY+cR5Z3VFMREckkTk3lmvB8W0KZhhSLiMh+4syo71IXgeQ9M+UUEZEM4kx+LAYuBjon7l/tbo4FQM1fIiKZxGn++iuwnUIf/QWoqiIikl6cpNLJ3U/MeST5TkOKRUQyijP662UzOz/nkTQEGlIsIpJWnJrKO8A4MysCdhGmlrv7wTmNLO9oRr2ISCZxkspDwKnAnHAHyMKk1i8RkYziNH8tAuYWdEKpoh+BiEhacWoqK4GpZvYy+y4oqSHFIiKyjzhJZUl4NA2PAqaaiohIOnFm1N8NYGatore+Oc6JzWwkcAmw2t17hLK7gP8E1oTdfuLuE8K224Abgd3Ad9x9YigfCPwWKAaedPf7Q3kXYDTQFngXuNbdd8aJrVZ0j3oRkYwy9qmYWQ8zew+YC8wzs1lm1j3GuUcBA5OU/8bde4VHVULpBgwCuodjHjOz4jCb/1HgQqAbMDjsC/BAOFdX4AuihJRDav4SEckkTkf9COD77n60ux8N/AD4faaD3P0NYF3MOC4DRrv7DndfApQB/cKjzN0Xh1rIaOAyMzPgHGBsOP4Z4PKYn3UAVFMREUknTlJp4e5Tqt64+1SgxQF85i1mNtvMRppZm1DWEViWsE95KEtV3g5Y7+4V1cqTCkv3zzSzmWvWrEm1W3pq/hIRyShOUllsZrebWefw+BlRx31tPA4cC/QiGlX2UChP1rbktShPyt1HuHtfd+/bvn37mkW8h5q/REQyiZNU/gNoDzwfHocCN9Tmw9x9lbvvdvdKoia0fmFTOXBkwq6dgBVpytcCrc2sSbXyHFNNRUQknTijv74AvpONDzOzDu6+Mry9gqjzH2A88GczGw4cAXQFphNVD7qGkV7LiTrzr3F3N7MpwFVE/SxDgBezEWOa4HN6ehGRxiDO6K/JZtY64X0bM5sY47hngX8CXzazcjO7EfiVmc0xs9nA2cD3ANx9HjAGmA+8AtwcajQVwC3ARGABMCbsC/Bj4PtmVkbUx/JU7KuuLfWpiIikFWfy46Huvr7qjbt/YWaHZTrI3QcnKU75i9/d7wPuS1I+AZiQpHwxe5vP6oAWlBQRySROn0qlmR1V9cbMjqYQf7uq+UtEJKM4NZWfAm+a2evh/RnA0NyFlMfU/CUiklacjvpXzKwP0J+oDeh77r4255HlHdVUREQyidNRb0RLp/Rx978CB5lZHfZl5Akz8Mr6jkJEJK/F6VN5jOgmXVUd75uI1uMqLFaspCIikkGcPpVT3L1PWFSyavRX4S2BX1QMlbvrOwoRkbwWp6ayK6wW7ABm1h4ovD/Zi4rBlVRERNKJk1QeAcYBh5nZfcCbwC9yGlU+smKorMi8n4hIAYsz+utPZjYLOJdoCNTl7r4g55HlGzV/iYhklDapmFkRMDvcufHDugkpT1W1ALprIqSISAppm7/CasIfJM6oL1hFxdGzaisiIinF6VPpQHQb4dfMbHzVI9eB5ZuNO6LZ9K/MWV7PkYiI5K84Q4rvznkUDcCqzbs4GHjx3U8Y2Ovo+g5HRCQvxemofz3TPoXALarU7Vbzl4hISnGavwRwi/pU3ilbXc+RiIjkLyWVmLaFKSrFBTjvU0QkrpRJxcxeC88P1F04+evl+WsAKC7AW8mIiMSVrk+lg5mdCVxqZqOptva7u7+b08jyzI4KoAiK2c0Tr3/MoS2b8W8ndarvsERE8kq6pHIHMAzoBAyvts2Bc3IVVD7aHSp1xVTyy5ejeaBKKiIi+0qZVNx9LDDWzG5393vqMKa8VBmSSpFVFuLNlEVEYsnYUe/u95jZpWb2YHhcUheB5ZvEmkpcUz5czc9emJOrkERE8k6cOz/+EvguMD88vhvKCkoF0ZDiuEnl/WXruWHUDP74zqe5DEtEJK/EmVF/MdArrAOGmT0DvAfclsvA8k1lDWsqb5WtzWU4IiJ5Ke48ldYJrw/JRSD5rjbNXyIihSZOUvkl8J6ZjQq1lFnEuEmXmY00s9VmNjehrK2ZTTazReG5TSg3M3vEzMrMbLaZ9Uk4ZkjYf5GZDUkoP8nM5oRjHjHL7Xr0Na2piIgUojgd9c8C/YHnw+NUdx8d49yjgIHVyoYBr7l7V+C18B7gQqBreAwFHocoCQF3AqcA/YA7qxJR2GdownHVPyurqmoqRUoqIiIpxWr+cveV7j7e3V90989iHvMGsK5a8WXAM+H1M8DlCeV/8Mg7QGsz6wBcAEx293Xu/gUwGRgYth3s7v90dwf+kHCunFDzl4hIZnW99tfh7r4SokQFHBbKOwLLEvYrD2XpysuTlCdlZkPNbKaZzVyzZk2tAt+bVOKtUqybQ4pIIcqXBSWT/Qr2WpQn5e4j3L2vu/dt3759rQLcqgUlRUQySptUzKwosaM9C1aFpivCc9U68uXAkQn7dQJWZCjvlKQ8Z/Z01JuSiohIKnV9j/rxQNUIriHAiwnl14VRYP2BDaF5bCJwvpm1CR305wMTw7ZNZtY/jPq6LuFcObHba9ZR71rKRUQKUJzJj1X3qJ8ObKkqdPdL0x1kZs8CZwGHmlk50Siu+4ExZnYj8Clwddh9AnARUAZsBW4In7HOzO4BZoT9fu7uVZ3/3yQaYdYceDk8ciZZR/2K9ds4onXzXH6siEiDkrN71Lv74BSbzk2yrwM3pzjPSGBkkvKZQI/axFYbyZLKgAf+zpJfXgzA2FnljHjjYyZ970xAHfUiUphi3aPezI4Gurr7q2Z2EISFsApIsqSS2MT1w//9oK5DEhHJO3EWlPxPYCzwRCjqCLyQy6DykWbUi4hkFmdI8c3AAGAjgLsvYu/8koKhGfUiIpnFSSo73H1n1Rsza0IB3qaqaun7JjEnP4qIFKI4SeV1M/sJ0NzMzgP+F/hrbsPKP5UpaioT5yVftcaSzs8UEWnc4iSVYcAaYA5wE9Hw35/lMqh8lGrtr5+O23duqGuCiogUsDijvyrDkvfTiJq9FnoB/uaMO6PePRpO7IXXQigikjmpmNnFwO+Aj4nW3OpiZje5e04nG+abvTPqlSxERFKJM/nxIeBsdy8DMLNjgZfI8Qz2fFMRair7d9R7mneR1Ru306xJMYccVJKb4ERE8kScPpXVVQklWMzehSALRqqO+uqqWgYTO+r7/eI1Tr3/tdwFJyKSJ1LWVMzsyvBynplNAMYQ/SF+NXvX4ioYB3qTrq07NRRZRBq/dM1fX014vQo4M7xeA7TZf/fGLe6M+o3bK2jbomldhCQikndSJhV3v6EuA8l3cWfUL16zmbYt2tZFSCIieSfO6K8uwLeBzon7Z1r6vrHZO6Ney7SIiKQSZ/TXC8BTRLPoC/Y3auyO+roIRkQkT8VJKtvd/ZGcR5LnUnXUV58GWptpoTsrKvnjO59w3alH06Q4zoA8EZH8FCep/NbM7gQmATuqCt393ZxFlYcqwxDhzDPqa55VnnxzMb96ZSHFRcaQ0zrXJjwRkbwQJ6mcAFwLnMPe5i8P7wuIsdstJ0vfb9peAcDmHRVZP7eISF2Kk1SuAI5JXP6+UFVQnHHpe/WpiEghi9OA/wHQOteBNASVFMWYUV9HwYiI5KE4NZXDgQ/NbAb79qkU1JBiiDrrk01+HPaX2XteL1q9iVOPbYfpdioisWzcvovPNmznXw5vVd+hSBbESSp35jyKBqIyRVIZPWPZnteL12yp8XlVu5FC9rXfT2PO8g0svf/i+g5FsiDO/VRer4tAGoLdsZq/lCFEamLO8g31HYJkUcY+FTPbZGYbw2O7me02s40H8qFmttTM5pjZ+2Y2M5S1NbPJZrYoPLcJ5WZmj5hZmZnNNrM+CecZEvZfZGZDDiSmOCoo2m9G/YZtu/bbb/L8Vbzx0ZrY51VTmYg0FnFqKvs0dJrZ5UC/LHz22e6+NuH9MOA1d7/fzIaF9z8GLgS6hscpwOPAKWbWlqhpri/RoKtZZjbe3b/IQmxJJeuor6jct2byx2mf8sw/P8lVCCIiea3G07fd/QVyM0flMuCZ8PoZ4PKE8j945B2gtZl1AC4AJrv7upBIJgMDcxDXHqk66vfZp1LNXyJSuOIsKHllwtsi9tYMDoQDk8zMgSfcfQRwuLuvBHD3lWZ2WNi3I7As4djyUJaqPGcqKco4o15EpJDFGf2VeF+VCmApUe3hQAxw9xUhcUw2sw/T7Jusx8HTlO9/ArOhwFCAo446qqax7rHbM3fU14b69kWksYjTp5L1+6q4+4rwvNrMxhH10awysw6hltKBvbcsLgeOTDi8E7AilJ9VrXxqis8bAYwA6Nu3b61/hceZUS8iUsjS3U74jjTHubvfU5sPNLMWQJG7bwqvzwd+DowHhgD3h+cXwyHjgVvMbDRRR/2GkHgmAr+oGiUWznNbbWKKq4JiSg4wqVz4239wRtdDue2i4/eUpRr99fnmHZRrUhAGAAAOjUlEQVQ0KeLg0pID+kwRkbqSrqaSbBZfC+BGoB1Qq6RCNEN/nEW/SZsAf3b3V8KM/TFmdiPwKXB12H8CcBFQBmwFbgBw93Vmdg8wI+z3c3dfV8uYYtlKKQex/YDOsWDlRhas3LhPUknlpHtfpXlJMQvuyen4AxGRrEl3O+GHql6bWSvgu0S/0EcDD6U6LhN3Xwz0TFL+OXBuknIHbk5xrpHAyNrGUlObvZQWdmBJpaa27VJzm4g0HGmHFIcJifcCs4kSUB93/7G7r053XGOVjZpKMuqoF5HGIl2fyq+BK4k6uE9w9811FlWe2kwpLXOQVKpoZr2INHTpaio/AI4AfgasSFiqZdOBLtPSUG31Ug7KYfOXaiwi0tCl61PRzdKr2UIpLQ6gpjLrk+QryKiGIiKNhRJHDWzxUkptF02o3W1//+3xt7MckYhIflFSqYEtNAfISWe9iEhjoKRSA5spBch6Z32mvhR359cTP2TxmoIfKyEieU5JpQY2e1RTaWVbc3L+VH0rn23czqNTPua6kdNz8rki+UArfDcOSio1sJ6WABySdLGB3KmqyVTs1n86abxefH95fYcgWaCkUgPrPUoqbSw3zVAaUiyFbN2WnfUdgmSBkkoNVCWV1llOKtWbvbbsqOCzDRoMIIXl3pcW1HcIkgVKKjXwRWj+asOmrJ63qoZSWem4O5c/+hb9f/nanu1VSWfrzgomzvssq58t0lCt3rSd//77IlxV/LyipFID22jGNm/Klyw3iyE/NPkjfjJuLotWJ68JbdxewU3/M4u5yzfk5PNFGpJbR7/Pg5M+Yo7+P+QVJZUaMT71w+iQo6QC8Oz0TzPus2l7NPmystLZurN2EzFFGrotO6MVvFdv3FHPkUgiJZUa+oJWWe9TycSS3jkZ7nlpPt3umMiOCi2PL4VnZ0V0a++v/2FmPUciiZRUamidt6Id9buephO1IY+dWQ7A9l2V9RmOSL2oTDGvZeP2XQz7y2y27FAtvj4oqdTQam/NYba+Tj8z5YKTofzyR99i3gq1K0thSfX/4onXP2b0jGWMentpncYjESWVGlrtbTjYttL8AJdq2bBtV+0PrvYH2pK1W/jFBA3HFAHN96pvSio19KkfBsDxlrlDPZ2xs8rZtbuSe/42n/VbNelLpKaqBqxIfkl5PxVJbnrlcQAMKJrLu7v/pdbncXcmzVvFU28uybjv6x+t2ffY8JxY+9dfZ1Jolq/flnb7rt2VbNi2i0Oal9RRRAKqqdTYatowrfI4LiyecUDnufelBdz853dj7fujsbP3eZ8sgSipiESq+loefnURPe+eVL/BFCAllVqYW9mFzvYZ+3Vu1JHn3y1n3ooNWEJP5aYdB9BHI1IPpi9Zx6ef52bFb6k/av6qhYXeiYNsB31sEe967ZvAauv595bz/HvL96nWb9ym9mVpWP79iX/m5Lyp5nVJ3VBNpRZe2t2f9d6CO0v+wCHkx42zdC8KkUjKIfhSJxp8UjGzgWa20MzKzGxYXXzmFppz+64b6Gaf8Kemv6Ad9TNHJPE/j5KKNCarNm5n8Ih3+KKGy+Fv37Wbtz/+PEdRSRwNuvnLzIqBR4HzgHJghpmNd/f5uf7sv1aexs5dJfy25L/5a7Of8sCuQbxS2Y8dNM31R++xfuvefpQKJRVpINydV+YmX237ot/+g2XrtrIpzIa/6Y+zGHPTqRnP+dcPVvDVnkdw3O2vZDVWqbkGnVSAfkCZuy8GMLPRwGVAzpMKwMTKk/m3nXfxcMlj/LbpY2zzJ3mz8gTm+9GUVR7BGlqz1g9mkx/EFkrZTlMqKIYctPmu3axF9WSvj9dsplmTIg5pXkLzkmI2bq/g/zzxT1qWNuG9T9ez5JcX8dSbS5gwZyXXD+jCwO5fommTqOFi844KFn62iSPbNOewg0v3nHNHxW42b6+gXctm+3zWS7NXAnDxiR2AKGms37qLDdt2cXS7g7j3pQUsW7eVSfNXZYx7/sp9l0CavmQdN//5Xa7pdxST5n3GJT2P4KXZK/neefv2ZX772ff4zuj3kp6zstIpKlKbWF2xhnwvAjO7Chjo7l8P768FTnH3W1Id07dvX585s+YL0HUe9lLqOKjkzKLZfKVoFv2LFtDFVlJsyX+ulW7spAk7KaGCIrwWCSbVMcVZ/I+TzbjSq83n1FzdXU/NZTu2Sncqk/y/ds/8OUVFUJmwlFyT4ijRVIR7/QCYGUWWusm1rn7Wcf8dFJnRpDg6v7uxc3clJcVFqftePO3bmLHV7mewa/e+6/iljTPhcyrdqdjtmEXHpPKlH02nWelBNY4NwMxmuXvfTPs19JpKsh/3fv8GzGwoMBTgqKOOqtUHnd/t8JR/aTlFTK3sxdTKXgA0YydH2Wra23rasZGWto0WbKcZu2hqu2hG9Cim5gtBWpp/4ke3TvaPpeb/JVLkwwxq8Tm1/O9a88+puTqLLUd/1CVODCwpMioq9/23dkjzkqRLBR3RsjkrNlQd63Rq2RyArbt277nd72EtS2nWpIhlX2zloJImbN0VNVW1bNZkv0UcWzYtZvPO9Kto1+ZnXZNjjji4Odjen/VnG7fTqqSEFk2L031A4lPOYqv2caxYv40ig6p8ffhBpaT+W3Hv57hH19WmeQmlJamvq4Plvhu9oSeVcuDIhPedgBXVd3L3EcAIiGoqtfmgEddlTNAiBaVffQfQCPWp7wCyoKGP/poBdDWzLmbWFBgEjK/nmEREClaDrqm4e4WZ3QJMBIqBke4+r57DEhEpWA06qQC4+wRgQn3HISIiDb/5S0RE8oiSioiIZI2SioiIZI2SioiIZI2SioiIZE2DXqalNsxsDfBJLQ8/FFibxXDyka6xcdA1Ng75dI1Hu3v7TDsVXFI5EGY2M87aNw2ZrrFx0DU2Dg3xGtX8JSIiWaOkIiIiWaOkUjMj6juAOqBrbBx0jY1Dg7tG9amIiEjWqKYiIiJZo6QSg5kNNLOFZlZmZsPqO56aMLMjzWyKmS0ws3lm9t1Q3tbMJpvZovDcJpSbmT0SrnW2mfVJONeQsP8iMxtSX9eUipkVm9l7Zva38L6LmU0L8T4Xbo+AmTUL78vC9s4J57gtlC80swvq50qSM7PWZjbWzD4M3+epje17NLPvhX+nc83sWTMrbejfo5mNNLPVZjY3oSxr35uZnWRmc8Ixj5ilu1dkHXB3PdI8iJbU/xg4BmgKfAB0q++4ahB/B6BPeN0K+AjoBvwKGBbKhwEPhNcXAS8T3YyuPzAtlLcFFofnNuF1m/q+vmrX+n3gz8DfwvsxwKDw+nfAN8PrbwG/C68HAc+F193C99sM6BK+9+L6vq6E63sG+Hp43RRo3Zi+R6AjsARonvD9Xd/Qv0fgDKL7b81NKMva9wZMB04Nx7wMXFiv32N9/0PK90f4siYmvL8NuK2+4zqA63kROA9YCHQIZR2AheH1E8DghP0Xhu2DgScSyvfZr74fRHf9fA04B/hb+A+2FmhS/Xskuv/OqeF1k7CfVf9uE/er7wdwcPiFa9XKG833GJLKsvCLs0n4Hi9oDN8j0LlaUsnK9xa2fZhQvs9+9fFQ81dmVf/Qq5SHsgYnNA/0BqYBh7v7SoDwfFjYLdX15vvP4WHgR0DVzdjbAevdveqm6Ynx7rmWsH1D2D+fr/EYYA3wdGjie9LMWtCIvkd3Xw48CHwKrCT6XmbRuL7HKtn63jqG19XL642SSmbJ2icb3JA5M2sJ/AW41d03pts1SZmnKa93ZnYJsNrdZyUWJ9nVM2zL22sk+ku8D/C4u/cGthA1m6TS4K4x9CtcRtRkdQTQArgwya4N+XvMpKbXlHfXqqSSWTlwZML7TsCKeoqlVsyshCih/Mndnw/Fq8ysQ9jeAVgdylNdbz7/HAYAl5rZUmA0URPYw0BrM6u6u2livHuuJWw/BFhHfl9jOVDu7tPC+7FESaYxfY9fAZa4+xp33wU8D5xG4/oeq2TreysPr6uX1xsllcxmAF3DCJSmRB2C4+s5ptjCSJCngAXuPjxh03igagTJEKK+lqry68IolP7AhlA9nwicb2Ztwl+U54eyeufut7l7J3fvTPT9/N3dvwZMAa4Ku1W/xqprvyrs76F8UBhV1AXoStQJWu/c/TNgmZl9ORSdC8ynEX2PRM1e/c3soPDvtuoaG833mCAr31vYtsnM+oef2XUJ56of9dmh01AeRCMyPiIaRfLT+o6nhrGfTlQdng28Hx4XEbU9vwYsCs9tw/4GPBqudQ7QN+Fc/wGUhccN9X1tKa73LPaO/jqG6JdJGfC/QLNQXhrel4XtxyQc/9Nw7Qup51E0Sa6tFzAzfJcvEI0CalTfI3A38CEwF/gfohFcDfp7BJ4l6iPaRVSzuDGb3xvQN/y8Pgb+m2qDOer6oRn1IiKSNWr+EhGRrFFSERGRrFFSERGRrFFSERGRrFFSERGRrFFSEckBM9scnjub2TX1HY9IXVFSEcmtzoCSihQMJRWR3Lof+Fczez/cK6TYzH5tZjPC/TJuAjCzs8zsdTMbY2Yfmdn9ZvY1M5se7pVxbNjv6nCvkQ/M7I16vTKRJJpk3kVEDsAw4IfufgmAmQ0lWnrjZDNrBrxlZpPCvj2B44nWr1oMPOnu/Sy6sdq3gVuBO4AL3H25mbWu64sRyUQ1FZG6dT7R2k7vE92CoB3R2lQAM9x9pbvvIFpyoyrZzCFqRgN4CxhlZv9JdAM5kbyimopI3TLg2+6+zyKOZnYWsCOhqDLhfSXh/6q7f8PMTgEuBt43s17u/nnOoxaJSTUVkdzaRHQb5yoTgW+G2xFgZv8SbrYVi5kd6+7T3P0OojsdHpnpGJG6pJqKSG7NBirM7ANgFPBboqasd8NS5WuAy2twvl+bWVeiGs9rRPdiF8kbWqVYRESyRs1fIiKSNUoqIiKSNUoqIiKSNUoqIiKSNUoqIiKSNUoqIiKSNUoqIiKSNUoqIiKSNf8PNNb0zh5C7fwAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "sorted_items = np.argsort(-counter_content)\n",
    "\n",
    "pyplot.plot(x_tick, counter_collaborative[sorted_items], label = \"Collaborative\")\n",
    "pyplot.plot(x_tick, counter_content[sorted_items], label = \"Content\")\n",
    "\n",
    "pyplot.ylabel('Number of recommendations')\n",
    "pyplot.xlabel('Items')\n",
    "pyplot.legend()\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Ideas on what you could do to improve your model performance. We will mostly not discuss them explicitly, but if you have questions on them please send us an email or use the challenge forum. For algorithms like matrix decompositions you can use the implementation provided in the libraries (scikit-learn mostly), for other types of algorithms please check with us directly before using them.\n",
    "\n",
    "\n",
    "#### Feature weighting applies not only to item features or user features. The items a user interacted with can themselves be considered as user features and vice versa. Feature weighting can be applied to items and users even in a collaborative model.\n",
    "#### Feature selection, a specific type of feature weigthing (weights are only 0 or 1) is too useful. You may remove some items or users because they add noise. Remember, the items you remove will likely never be recommended and the users you remove will become cold users, you may need to add an ad-hoc strategy to recommend to them (for example, top popular).\n",
    "#### There are a lot of techniques to perform feature weigthing and selection, we saw rapidly IDF and BM25, but many other are possible, for example removing features that have low variance or features that have a low correlation with the desired model output (used in classification, more difficult in RecSys). See as initial reference: https://scikit-learn.org/stable/modules/feature_selection.html.\n",
    "#### Sometimes the features can be represented in a different space, for example by using Principal component analysis, Independent Component Analysis, Non-Negative Matrix Factorization or Canonical Correlation Analysis... Those will all allow you to represent the ICM (or URM in fact) as a different matrix which contains approximately the same information but represented in a different way. Usually, you have the same number of items but each item has a vector of length much lower than the number of original features, these vectors are called embeddings and their length is the number of \"components\" or \"latent dimensions\". The less you have, the more compressed the data is. Not all decompositions are interchangeable. Remember that KNNs work by looking for \"common features\", if you compress the data a little you may improve your model because you remove noise, but if you compress too much you end up with a set of almost completely independend features and your KNN model may not work. See: https://scikit-learn.org/stable/modules/classes.html#module-sklearn.decomposition\n",
    "#### The user-item interaction value is not set in stone, you can weight that number according to some heuristics, for example you can weight less interactions of very popular items or users with huge profiles, this will impact how the item-item or user-user similarities are computed.  For example: interaction value * log(popularity) or sqrt(popularity) or other ways, it is a heuristic so its success depends on the data and you may need to try a few\n",
    "#### Implement new similarities, there is a number of variants of the heuristics we have shown you or you can design your own combining them and adding new hyperparameters to weight them. See for example: \"Vito Walter Anelli, Tommaso Di Noia, Eugenio Di Sciascio, Azzurra Ragone, and Joseph Trotta. 2019. The importance of being dissimilar in recommendation. In Proceedings of the 34th ACM/SIGAPP Symposium on Applied Computing (SAC '19)\": https://dl.acm.org/doi/pdf/10.1145/3297280.3297360 \n",
    "#### Optimization of hyperparameters is very important in any prediction/classification/recommendation task. Sometimes spending a few extra hours optimizing is more efficient than spending a few days in searching for new ideas or models. Combine the two for the best outcome!\n",
    "#### Keep it simple. The literature is full of complex or over-complex models that promise in theory of being able to learn everything but, in practice, they may be very difficult to implement, train and optimize. Prefer simple models to very complex ones, you may spend a lot of time to get them to run and train only to discover that it takes 15 hours for them to complete their training on a single hyperparameter set.  \"Maurizio Ferrari Dacrema, Paolo Cremonesi, and Dietmar Jannach. 2019. Are we really making much progress? A worrying analysis of recent neural recommendation approaches. In Proceedings of the 13th ACM Conference on Recommender Systems (RecSys '19).\": https://doi.org/10.1145/3298689.3347058 https://arxiv.org/abs/1907.06902"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
